我们的想法是在运行时用C ++创建对象。
此创建的输入将是一个json文件。例如
{
"pi": 3.141,
"happy": true,
"name": "Niels",
"nothing": null,
"answer": {
"everything": 42
},
"list": [1, 0, 2],
"object": {
"currency": "USD",
"value": 42.99
}
}
在C ++中有什么选择?可以增加对此的帮助吗?
答案 0 :(得分:7)
你不能在标准C ++中做(在运行时定义类),因为类有一些与之关联的代码(至少是隐式构造函数和析构函数,通常是成员函数,并且经常有一些{{ 3}},由编译器生成,指向代码)。
您的JSON解析库(例如vtable)将提供表示任意JSON对象的类型(在大括号中)。
在某些jsoncpp上,您可以在运行时加载operating systems(包含代码);在Linux和POSIX上使用plugin但请注意dlopen(3)(请参阅name mangling)。该插件是一个共享对象,您需要专门编译为C++ dlopen Mini-HowTo。几个框架库(position-independent code,Qt,POCO ...)提供了加载插件的常见抽象,...
你甚至可以(我在Boost DLL,在Linux上这样做)在运行时在一些临时文件中动态生成一些C ++代码,将该临时文件编译成一些临时插件,然后加载该插件......所有这些都在同一个MELT。
答案 1 :(得分:1)
你可以做到这一点,或接近这个(我简化):
class VariableClass
{
private:
typedef map<string, boost::any> MembersMap;
string objectType; // a label, defined at parsing...
// could be an ID, but then you'd already know
// the members to expect, and could use a 'regular' class.
MembersMap members;
... etc...
boost::any& operator [](const std:string& s) ( return members[s]; }
};
这是过于简单的,但应该做你想要的。您可能希望用std :: variant替换boost :: any,或者使用包含所需类型的自定义专用模板类,这也可以在运行时从json确定。
[edit]我添加了一个变量&#39; objectType&#39;。