Boost变量:我如何做一个返回已设置类型的访问者

Boost Variant : How can I do a visitor that returns the type that was set?

本文关键字:置类型 访问者 返回 变量 何做一 Boost      更新时间:2023-10-16

我正在尝试编写一个使用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)。我遇到的问题是,我想让用户查询特定密钥是否存储为特定类型。

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

如果你想一想:你不想为特定的键值硬连接特定的类型。否则,就意味着你失去了boost::variant的所有力量。这意味着每个键集都应该有不同的映射(正如你静态地知道的那样,你不应该把所有东西都放在同一个映射中)。

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

注意:在您的示例中,当您的项目被找到时,您会查找两次,您应该存储find的结果,而不是丢弃它,这样可以省去第二次查找。