在条件

时间:2017-03-21 22:31:10

标签: c++ dictionary stl stdmap

我有3种不同的C ++地图声明。

map<string, string> map1; 
map<string, int> map2; 
map<string, double> map3; 

我想根据条件使用其中一张地图。我们说

if (map_value == "map1") { default_map = map1; } 
else if (map_value == "map2") { default_map = map2; } 
else { default_map = map3; } 

我的问题是我不知道如何在C ++中声明default_map,可以根据条件进行更改。我期待C ++中的map<Object,Object> default_map声明。

编辑。 我选择了stringintdouble作为假设对象。实际的map1map2map3存储函数指针。根据地图内部的值,我调用不同的函数。函数签名是相同的,但那些函数指针来自不同的类。实质上,class Avoid funcA(string);class Bvoid funcA(string);class Cvoid funcA(string);funcA的实现方式不同取决于班级。

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

C ++有足够强大的打字能力,你在这里要求的时候会遇到很多困难。

我可以看到几个明显的可能性。一种方法是使用Boost Variant之类的东西来存储值:

std::map<string, boost::variant<string, int, double> > mapN;

这样,您就可以将stringintdouble中的任何一个与给定字符串关联起来。变体类型基本上是一个有区别的联合 - 也就是说,它可以存储任何一个指定的类型,并且有一个字段告诉任何特定实例中存在哪一个。

另一种可能性是使所有三种值类型的内容看起来像一个单独的函数,因此您可以跨调用站点使用统一的代码:

void save_map(std::string const &key, std::string const & val) { 
    map1[key] = val;
}

void save_map(std::string const &key, int val) { 
    map2[key] = val;
}

void save_map(std::string const &key, double val) { 
   map3[key] = val;
}

这使save_map("foo", bar);之类的代码可以作为bar的三种指定类型中的任何一种(加上隐式转换)。但请注意,最初看起来最明显的检索值的设计将无效。特别是,您不能在返回类型上重载,因此您不能拥有类似的内容:

std::string get_map(std::string);
int get_map(std::string);
double get_map(std::string);

您不能在返回类型上重载,因此重载类型必须作为参数传递:

void get_map(std::string const &key, string &dest);
void get_map(std::string const &key, int &dest);
void get_map(std::string const &key, double &dest);

关于这些(或其他一些可能性)中的哪一个是有意义的:这取决于你真正想要完成的事情 - 你没有告诉我们足够的事情来提供有意义的答案。

答案 1 :(得分:1)

鉴于您在评论中的澄清,我可以提供以下建议:

std::function<R(K, T1, T2, T3)> look_up_and_call;

X x;
Y y;
Z z;

if (map_value == "map1") {
  look_up_and_call =
      [&x, &map1](K key T1 t1, T2 t2, T3 t3) { return (x.*map1[key])(t1, t2, t3); }
} else if (map_value == "map2") {
  look_up_and_call =
      [&y, &map2](K key T1 t1, T2 t2, T3 t3) { return (y.*map2[key])(t1, t2, t3); }
} else {
  look_up_and_call =
      [&z, &map3](K key T1 t1, T2 t2, T3 t3) { return (z.*map3[key])(t1, t2, t3); }
}

现在对于任何给定的映射键key,您可以调用绑定函数:

R result = look_up_and_call(key, arg1, arg2, arg3);

我已经简化了一些代码,例如我们假设map元素总是非null成员函数指针。您可以调整此方案以允许其他类型的指针,并且实际代码应该可能处理密钥的不存在。您还可以编写类似的函数来向地图添加元素。