Dynamic C ++ Map <string,primitives =“”(int,=“”double,=“”string,=“”或=“”array“=”“> </string,>

时间:2015-01-15 21:39:00

标签: c++ dynamic dictionary

我提前道歉,但我找不到这个。

在C ++中我希望有一张地图。此地图将由<string, Object>组成;在运行时期间从XML文档添加动态对象的位置。 Object将是int,double,string或int,double或string数组。钥匙保证是独一无二的。但是,我需要一种方法来使用地图动态声明它。

这可能是我应该为数据部分使用模板的实例吗?

我无法使用像lib这样的大型lib来实现这一点,因为这应该是一个轻量级的程序。 (参考:Use boost C++ libraries?

这与我想要实现的类似。用户指定基元类型的地方:(参考:Creating dictionary that map type T as key to instance of type T

std::map <std::string, ????> Values;

修改 所以,如果我不能使用boost,我可以使用模板来实现吗?

在提升中,我是这个:

typedef boost::variant<int, double, std::string> datum;
std::map<std::string, datum> Parms;

然后我稍后在运行时添加值(来自XML,其中每个元素都有一个具有指定类型的属性)

Parms["a"] = 10; // int
Parms["b"] = 102.2039; // double
Parms["c"] = 6.6667e-07; // another double
Parms["d"] = "Hello world"; // std::string

问题在于我这样做:

datum v1 = obj.get("c");  // need double, not datum

1 个答案:

答案 0 :(得分:0)

您可以考虑在结构中嵌入基本类型。您可以定义从中派生不同结构的基类。您可能需要将类型保存到结构中,但为了简单起见,我将其保留了下来。

如果你真的需要原始类型,请忽略我的答案并选择Boost。

#include <map>
#include <string>

struct BaseObject {};

struct ObjectInt : public BaseObject
{
  int a;
};

struct ObjectString : public BaseObject
{
  std::string a;
};

int main()
{
  BaseObject *oi, *os;
  oi = new ObjectInt;
  os = new ObjectString;
  std::map<std::string, BaseObject *> objectMap;

  objectMap["oi"] = oi;
  objectMap["os"] = os;

  delete oi;
  delete os;

  return 0;
}