【发布时间】:2014-02-18 12:29:37
【问题描述】:
我想将两种(不是更多)不同的数据类型作为值放入映射中,如下例所示:
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]] )
这可能吗?同样,它将仅限于两种不同的数据类型。
【问题讨论】:
-
我会用两个成员变量制作包装类,并在地图声明中使用它。
-
boost::variant 可能会有所帮助。
-
您是否考虑过将
typeX和typeY制作为公共基类的子类?
标签: c++ dictionary polymorphism stdmap