如何使用具有模板转换运算符的非模板代理对象来避免指定boost :: variant的类型?

时间:2013-07-26 16:24:54

标签: c++ boost stl

我有以下变体:

typedef boost::variant<double, long int, std::string> ConfigVariant;

然后我定义了一张地图:

std::map<std::string, ConfigVariant> config_values;

我的Config类中也有operator[](Config包含变体和地图):

ConfigVariant & Config::operator[] (const string &key) {
  return config_values[key];
}

理想情况下,我想说double d = config_values["double_key"]而不是double d = boost::get<double>(config_values["double_key"])。根据{{​​3}},应该可以使用带有模板转换运算符的非模板代理来执行我想要的操作,但我不确定如何操作。有人可以提供一些指导吗?感谢。

1 个答案:

答案 0 :(得分:0)

你错过了一些能够正确回答的细节;即除了Config成员之外,你没有说operator[]

也许实施Config::operator[]作为模板来调用boost::get<>,而不是

ConfigVariant & Config::operator[] (const string &key) {
    return config_values[key];
}
你有:

template<typename T>
T &Config::operator[] (const string &key) {
    return boost::get<T>(config_values["double_key"]);
}

现在你可以写

double d = config["double_key"];

假设config的类型为Config