我想将两种(不是更多)不同的数据类型作为值放入映射中,如下例所示:
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 许可协议
您想使用
boost::variant
: