如何实现具有不同数据类型作为值的映射?

新手上路,请多包涵

我想将两种(不是更多)不同的数据类型作为值放入映射中,如下例所示:

 typeX A, B, ...;
typeY Z, Y, ...;

void func (typeX) { ... }
void func (typeY) { ... }

std::map <std::string, what_to_put_here??> map;
map["a"] = A;
map["z"] = Z;
...

std::vector<std::string> list;
// This list will be something like "a", "y", ...

for (unsigned int i = 0; i < list.size(); ++i)
    func( map[list[i]] )

显然这不起作用,因为地图只接受一种数据类型的值。但是,当循环 list func() 调用应该是明确的,因为 map[list[i]] 的类型是已知的。

我想避免显式转换或类型检查,即这样的:

 if (typeid( map[list[i]] ).name() == "typeX")
    func( map[list[i]] )
else if (typeid( map[list[i]] ).name() == "typeY")
    func( map[list[i]] )

这可能吗?同样,它将仅限于两种不同的数据类型。

原文由 user3240855 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 689
2 个回答

您想使用 boost::variant

 std::map <std::string, boost::variant<typeX, typeY>>

原文由 Paul Evans 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题