0

我正在尝试编写一个使用 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。

编辑

我添加了我希望实现的类设计(即通用哈希图)。我遇到的问题是我想要一种方法让用户查询特定键是否存储为特定类型。

4

1 回答 1

1

如果您有这样的问题,这可能意味着您应该使用访问者,而不是希望从您的变体中获取价值。这通常是搭配的方式boost::variant

如果您考虑一下:您不想为特定键值硬连接特定类型。否则,就意味着你失去了所有的力量boost::variant。这意味着您应该为每个键集使用不同的映射(因为您静态地知道它们,您不应该将所有内容放在同一个映射中)。

boost::variant真的在这里帮助您进行动态调度,而不是静态分支。

注意:在您的示例中,您在找到项目时查找了两次,您应该存储结果find而不是丢弃它,从而为您节省第二次查找。

于 2013-02-21T00:46:50.543 回答