在理想情况下,我想通过以下方式使用ClassVariant:
// store & retrieve int
map<string, ClassVariant> mapValues;
mapValues["int_fieldX"] = ClassVariant(20);
int fieldX = (mapValues["int_fieldX"])();
// Or int fieldX = (mapValues["int_fieldX"]);
但是,我只能实现以下代码,该代码需要检索语句来提供类型信息,如下所示:
int fieldB = (mapValuesTwo["int_fieldB"])(int(0));
如您所见,
int(0)
作为类型信息提供。有没有一种方法可以消除此限制。这样就不需要类型信息。#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <boost/variant.hpp>
using namespace std;
typedef boost::variant<int, double, string> VarIntDoubleString;
class ClassVariant
{
public:
ClassVariant() : m_value(int(0)) {}
ClassVariant(VarIntDoubleString _val) : m_value(_val) {}
template<typename T>
T operator()(const T&) const
{
return boost::get<T>(m_value);
}
private:
VarIntDoubleString m_value;
};
int main(void)
{
map<string, ClassVariant> mapValuesTwo;
// store & retrieve int
mapValuesTwo["int_fieldB"] = ClassVariant(20);
int fieldB = (mapValuesTwo["int_fieldB"])(int(0));
cout << "fieldB: " << fieldB << endl;
// store & retrieve string
mapValuesTwo["int_fieldD"] = ClassVariant("Hello world");
string fieldD = (mapValuesTwo["int_fieldD"])(string(""));
cout << "fieldD: " << fieldD << endl;
}
// Output
fieldB: 20
fieldD: Hello world
最佳答案
您不能这样做,模板参数推导仅适用于参数,而不适用于函数的返回值。最好的选择是放弃operator()
以获得get<T>()
之类的常规功能。不过,我无法指向标准中的相关行,这对我来说太模糊了。
注意:如果有这种可能,我的猜测是boost::variant已经具有get
函数,其中不要求指定T
。
编辑:看到这个question
关于c++ - 在不传递类型信息的情况下使用 `boost::variant`来存储和检索值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8919732/