C ++中的元类和反思

时间:2009-08-17 14:23:30

标签: c++ reflection

我在空闲时间收到一个小问题,要求在C ++中更改对象行为以及运行时的类行为。我读了一下,找到了这个链接,对我来说非常有用。 http://www.vollmann.ch/en/pubs/meta/meta/meta.html Volmann先生制作了一个Meta对象协议(MOP),用于在运行时定义类,更确切地说是它们的属性。

我试图在运行时通过动态加载dll在同一事件中添加方法,但是对象并不知道他们新添加的行为。我在xml文件中保存了dll中方法的详细信息,当我想向类/对象添加新行为时,我解析了xml文件并仅加载了我需要的DLL,但这不够灵活。

这只是一个研究案例,所以如果你有任何指导,请做。我没有太多的C ++经验,但我喜欢这个挑战。

提前谢谢。

3 个答案:

答案 0 :(得分:5)

您可以尝试为所有类创建某种基类。这个类有一些函数指针的add方法。每个fp都分配了某种句柄或字符串。之后,您可以通过某种通用调用方法调用添加的函数。

对于函数的参数 - 你需要一些方法将它传递给函数以引用类的数据。也许你会将数据封装在某种结构中,并将引用/指针传递给结构。对于其他参数,您可以使用一些指针列表或查看bind。

请注意 - 这是一项重大任务,因为C ++不是在考虑这些事情的情况下创建的。

答案 1 :(得分:2)

上面的Tobias L'方法是我认为唯一可能的解决方案,真正的困难(正如TL所说)传递并将参数绑定到新方法 - 在我看来,大多数技术代码可能会得到帮助通过使用标准的增强库功能,很长一段时间。特别是boost :: bind和function / functional的东西似乎提供了很多你可能需要根据Volmann先生的“属性”框架制作'方法'。

答案 2 :(得分:1)

您将无法通过动态库加载将方法添加到C ++对象。它只是不起作用。

一般来说,人们将整个对象存储在DLL的内容中......即使这也是C ++的痛苦(由于名称错误)。你会一次又一次地看到的成语是在extern中声明的单个函数“ C“您找到的块(通过dlsym()或其他)返回可用于创建一系列不同对象的工厂类。