动态C++映射<字符串、基元(整数、双精度、字符串或数组)>

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

本文关键字:字符串 双精度 数组 gt 整数 基元 映射 lt 动态 C++      更新时间:2023-10-16

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

在C++我想要一张地图。 这张地图将包含<string, Object>;其中对象是在运行时从 XML 文档动态添加的。 对象可以是整数、双精度、字符串或整数、双精度或字符串数组。 密钥保证是唯一的。 但是,我需要一种方法来使用映射动态声明这一点。

当我

应该为数据部分使用模板时,这可能是一个实例吗?

我不能使用像 boost 这样的大型库来实现这一点,因为这应该是一个轻量级的程序。(参考:使用提升C++库?

这与我试图实现的目标类似。 其中用户指定了基元类型:(参考:创建将类型 T 映射为类型 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

您可以考虑在结构中嵌入基元类型。可以定义从中派生不同结构的基类。您可能还需要将类型保存到结构中,但为了简单起见,我省略了它。

如果你真的需要基元类型,请忽略我的回答,选择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;
}