在理想情况下,我想通过以下方式使用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/

10-09 13:36