动态 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;
}
抱歉,我找不到这个。
在 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;
}