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

标签 c++ boost stl

我有以下变体:

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

然后我定义一个 map :

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

我也有这个operator[]在我的 Config 类中(Config 包含变体和 map ):

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"]) .根据this question and answer ,应该可以使用带有模板转换运算符的非模板代理来做我想做的事,但我不确定如何做。有人可以提供一些指导吗?谢谢。

最佳答案

您遗漏了一些无法正确回答的细节;也就是说,你什么都不说 Config除了operator[]成员(member)。

也许实现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

关于c++ - 我如何使用具有模板转换运算符的非模板代理对象来避免指定我的 boost::variant 的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17886408/

相关文章:

c++ - 尝试使用 conan 安装 gtest 时出现 HTTPSConnectionPool 错误

C++ - 如何检查类型对齐要求

c++ - 在 C++ for 循环中使用除 int 以外的数据类型作为索引值

c++ - 在没有 boost 的情况下编译asio库

c++ - 在构造函数中抛出异常时未调用析构函数

c++ - std::regex 在 VC2015U3 上比 boost::regex 慢得多

c++ - C++中的二维字符串

c++ - 为什么我可以将 boost map_list_of 传递给接受映射而不是构造函数的函数?

c++ - 为什么我们可以避免在 lambda 捕获中指定类型?

c++ - std::strings 的容量()、保留()和调整大小()函数