动态 C++ 映射 <String, Primitives (int, double, string, or array)>

Dynamic C++ Map <String, Primitives (int, double, string, or array)>

抱歉,我找不到这个。

在 C++ 中,我想要一个地图。该地图将包含 <string, Object>;其中对象是在 运行 时间内从 XML 文档动态添加的。 Object 可以是 int、double、string 或 int、double 或 string 的数组。密钥保证是唯一的。但是,我需要一种使用地图动态声明它的方法。

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

我不能使用像 boost 这样的大库来实现这个,因为这应该是一个轻量级的程序。 (参考: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

您可以考虑将原始类型嵌入到结构中。您可以定义一个基础 class,从中派生出不同的结构。您可能还需要将类型保存到结构中,但为了简单起见,我将其省略了。

如果你真的需要原始类型,请忽略我的回答并使用 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;
}