我有3个不同的C++映射声明。

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

我想根据情况使用其中一张 map 。比方说
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 A具有void funcA(string);class B具有void funcA(string);class C具有void funcA(string);funcA的实现取决于类。

任何帮助表示赞赏。

最佳答案

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

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); }
}

现在,对于任何给定的 map 键key,您都可以这样调用绑定(bind)函数:
R result = look_up_and_call(key, arg1, arg2, arg3);

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

关于c++ - 根据条件在3种不同的 map 中选择,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42939407/

10-11 22:59
查看更多