根据条件选择 3 个不同的地图
choose among 3 different maps on condition
我有 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
声明。
编辑。
我选择了 string
、int
和 double
作为假设对象。实际的 map1
、map2
和 map3
存储函数指针。根据地图中的值,我调用了不同的函数。函数签名相同,但那些函数指针来自不同的 classes。本质上,class A
有 void funcA(string);
,class B
有 void funcA(string);
,class C
有 void funcA(string);
,funcA
的实现方式不同取决于 class.
感谢任何帮助。
C++ 具有足够强大的类型,因此您在执行此处要求的操作时会遇到很多困难。
我可以看到几个明显的可能性。一种是使用类似 Boost Variant 的东西来存储值:
std::map<string, boost::variant<string, int, double> > mapN;
这将使您可以将 string
、int
或 double
中的任何一个与作为键的给定字符串相关联。变体类型基本上是一个有区别的联合——也就是说,它可以存储任何一种指定类型,并且有一个字段告诉在任何特定实例中存在哪一种类型。
另一种可能性是拥有一个看起来像为所有三种值类型重载的函数,这样您就可以在调用站点之间拥有外观统一的代码:
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
三种指定类型中的任何一种(加上隐式转换)。但是请注意,最初看起来最明显的检索值设计是行不通的。特别是,你不能重载 return 类型,所以你不能有类似的东西:
std::string get_map(std::string);
int get_map(std::string);
double get_map(std::string);
您不能重载 return 类型,因此必须将重载类型作为参数传递:
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);
至于这些(或其他一些可能性)中的哪一个有意义:这将取决于您真正想要完成的事情——您没有告诉我们足够多的内容来给出有意义的答案。
鉴于您在评论中的说明,我可以提供以下建议:
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);
我稍微简化了代码,例如我们假设映射元素总是非空成员函数指针。您可以调整此方案以允许其他类型的指针,并且实际代码可能应该处理密钥不存在的问题。您还可以编写类似的函数来向地图添加元素。
我有 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
声明。
编辑。
我选择了 string
、int
和 double
作为假设对象。实际的 map1
、map2
和 map3
存储函数指针。根据地图中的值,我调用了不同的函数。函数签名相同,但那些函数指针来自不同的 classes。本质上,class A
有 void funcA(string);
,class B
有 void funcA(string);
,class C
有 void funcA(string);
,funcA
的实现方式不同取决于 class.
感谢任何帮助。
C++ 具有足够强大的类型,因此您在执行此处要求的操作时会遇到很多困难。
我可以看到几个明显的可能性。一种是使用类似 Boost Variant 的东西来存储值:
std::map<string, boost::variant<string, int, double> > mapN;
这将使您可以将 string
、int
或 double
中的任何一个与作为键的给定字符串相关联。变体类型基本上是一个有区别的联合——也就是说,它可以存储任何一种指定类型,并且有一个字段告诉在任何特定实例中存在哪一种类型。
另一种可能性是拥有一个看起来像为所有三种值类型重载的函数,这样您就可以在调用站点之间拥有外观统一的代码:
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
三种指定类型中的任何一种(加上隐式转换)。但是请注意,最初看起来最明显的检索值设计是行不通的。特别是,你不能重载 return 类型,所以你不能有类似的东西:
std::string get_map(std::string);
int get_map(std::string);
double get_map(std::string);
您不能重载 return 类型,因此必须将重载类型作为参数传递:
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);
至于这些(或其他一些可能性)中的哪一个有意义:这将取决于您真正想要完成的事情——您没有告诉我们足够多的内容来给出有意义的答案。
鉴于您在评论中的说明,我可以提供以下建议:
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);
我稍微简化了代码,例如我们假设映射元素总是非空成员函数指针。您可以调整此方案以允许其他类型的指针,并且实际代码可能应该处理密钥不存在的问题。您还可以编写类似的函数来向地图添加元素。