C++ Boost Variant:如何让访问者返回设置的类型?

C++ Boost Variant:如何让访问者返回设置的类型?,c++,boost,boost-variant,C++,Boost,Boost Variant,我正在尝试编写一个通用映射,它使用boost:variant作为值。 我一直在尝试编写get(std::string key)函数,该函数将返回适当的类型 以下是我到目前为止的想法: class GenericHashMap { private: std::map< std::string, boost::variant<int, bool, double, std::string> > genericMap; public: template<typena

我正在尝试编写一个通用映射,它使用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;
  }
}
类GenericHashMap{
私人:
std::mapgenericMap;
公众:
模板
bool getValue(const std::string和key,T和value){
if(_map.find(key)==_map.end()){
返回false;
}
T*valuePtr=boost::get(_map[key]);
如果(valuePtr==NULL){
返回false;
}
value=*valuePtr;
返回true;
}
}
我很好奇我应该如何处理迭代器?是否值得创建自己的嵌套迭代器,或者只返回嵌套的std::map

编辑


我添加了我希望实现的类设计(即通用hashmap)。我遇到的问题是,我想让用户查询特定密钥是否存储为特定类型。

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

仔细想想:您不想为特定的键值硬连接特定的类型。否则,这意味着您将失去
boost::variant
的所有功能。这意味着您应该为每个关键点集拥有不同的映射(正如您静态地知道的,您不应该将所有内容都放在同一个映射中)

boost::variant
真正帮助您实现动态调度,而不是静态分支


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

如果类型错误,访问者可以返回NULL
boost::get
不是访问者。你想做什么?一个仅仅是
boost::variant
的映射还没有做什么?我希望映射返回特定类型,如果这是为键设置的。i、 如果有人将一个键“hello”设置为一个未签名的int,我想确保尝试将其设置为std::string是不正确的。您打算如何使用这个函数?(用一些(伪)代码而不是文字来描述。)我对如何为这样的用例编写访问者感到困惑。我想让访问者返回我要指定的模板的值或NULL?当有人试图将变量分配给某个类型时,我想确保映射是使用他们期望的类型存储的?我想说的是,错误在于设计:您不应该希望这样。想想你的根本问题,而不是试图回避它。您正在混合动态运行时信息和静态信息:它无法工作。要么静态地拥有多个贴图,要么接受变量中的类型是动态的。您不能同时拥有这两种:这就是C++输入系统强制执行的内容。