我正在尝试编写一个使用boost:variant作为值的通用映射。 我一直试图编写将返回相应类型的get(std :: string key)函数。
这是我到目前为止所提出的:
class GenericHashMap {
private:
std::map< std::string, boost::variant<int, bool, double, std::string> > genericMap;
public:
template<typename T>
bool getValue(const std::string & key, T & value) {
if ( _map.find(key) == _map.end() ) {
return false;
}
T * valuePtr = boost::get<T>(_map[key]);
if (valuePtr == NULL) {
return false;
}
value = *valuePtr;
return true;
}
}
我很好奇我应该如何处理迭代器?是否值得制作我自己的嵌套迭代器或只返回嵌套的std :: map。
修改
我添加了我希望实现的类设计(即通用hashmap)。我遇到的问题是我想要一种方法让用户查询是否将特定键存储为特定类型。
答案 0 :(得分:1)
如果您遇到此类问题,可能意味着您应该使用访问者,而不是希望从您的变体中获取价值。通常采用boost::variant
的方式。
如果您考虑一下:您不希望为特定键值硬连线特定类型。否则,这意味着你失去了boost::variant
的所有力量。这意味着你应该为每个密钥集设置不同的地图(正如你所知道的那样,你不应该把所有内容放在同一个地图中)。
boost::variant
实际上是为了帮助您进行动态调度,而不是静态分支。
注意:在您的示例中,如果找到项目两次,您应该存储find
的结果而不是丢弃它,从而节省第二次查找。