根据条件在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
存储函数指针。根据映射中的值,我调用不同的函数。函数签名是相同的,但这些函数指针来自不同的类。从本质上讲,它是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); }
}
现在,对于任何给定的映射键key
,您可以按如下方式调用绑定函数:
R result = look_up_and_call(key, arg1, arg2, arg3);
我稍微简化了代码,例如,我们假设 map 元素始终是非空成员函数指针。您可以调整此方案以允许其他类型的指针,并且实际代码可能应该处理密钥不存在的问题。您还可以编写类似的函数来向地图添加元素。
C++具有足够强大的类型,因此您将很难完成此处的要求。
我可以看到几种明显的可能性。一种是使用类似 Boost 变体的东西来存储值:
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
三种指定类型中的任何一种(加上隐式转换)。但是请注意,最初似乎是检索值的最明显的设计将不起作用。特别是,您不能重载返回类型,因此您不能具有以下内容:
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);
至于其中哪一种(或其他可能性)有意义:这取决于你真正想要完成什么——你还没有告诉我们足够多的事情来给出一个有意义的答案。
- 从命令行c++发送文本文件名
- 使用新行和不使用新行读取文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 预处理器:插入结构名称中的前一个行号
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 为什么不;名字在地图上是按顺序排列的吗
- C++一会儿循环读到地图上 2 行?
- 计算所选行的总和
- 如何从 gtkmm 树视图中获取所选行
- 如何在多行文本C++的左上角显示复选框
- 如何将所选行的第一列值绑定到变量并在 QT 的 SQL 命令中使用它?
- 如何让我的QTableView与QSqlTableModel具有复选框和多行?
- 使用单词键将多个行号的向量添加到我的地图中
- 是否有一个WinAPI可以从带有可选空格和其他参数的命令行获取文件名
- TCLAP:如何检查是否指定了可选的命令行参数
- 可选的命令行参数
- Qt C++ 从 QTableView 中获取所选行的每个单元格的数据
- 当输入行结尾混合时,Std::getline可选
- C++ 中客户端程序的可选命令行参数
- QTableView的选定项中所选行/行的顺序