C ++如何在运行时定义类?

时间:2017-06-19 11:23:42

标签: c++ boost

我们的想法是在运行时用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 ++中有什么选择?可以增加对此的帮助吗?

2 个答案:

答案 0 :(得分:7)

你不能在标准C ++中做(在运行时定义类),因为类有一些与之关联的代码(至少是隐式构造函数和析构函数,通常是成员函数,并且经常有一些{{ 3}},由编译器生成,指向代码)。

您的JSON解析库(例如vtable)将提供表示任意JSON对象的类型(在大括号中)。

在某些jsoncpp上,您可以在运行时加载operating systems(包含代码);在Linux和POSIX上使用plugin但请注意dlopen(3)(请参阅name mangling)。该插件是一个共享对象,您需要专门编译为C++ dlopen Mini-HowTo。几个框架库(position-independent codeQtPOCO ...)提供了加载插件的常见抽象,...

你甚至可以(我在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;。