2

有没有人有任何关于在 C++ 中构建完整的对象/类反射系统的参考资料?

我见过一些疯狂的宏/模板解决方案,但是我从来没有找到一个系统可以将所有问题都解决到我喜欢的水平。

谢谢!

4

3 回答 3

2

我不完全确定我是否理解您的意图,但是 Qt 框架包含一个强大的元对象系统,它可以让您执行反射系统所期望的大多数操作:获取类名作为字符串,检查对象是否是给定类型、列表和调用方法等。

于 2009-10-08T20:29:39.070 回答
2

使用模板和宏来自动或半自动地定义一切几乎是 C++ 中唯一的选择。C++ 的反射/自省能力非常弱。但是,如果你想做的主要是序列化和存储,这已经在Boost 序列化库中实现了。您可以通过在类上实现序列化程序方法来做到这一点,或者如果您不想修改类,则可以使用外部函数。

不过,这似乎不是您要问的。我猜你想要像自动序列化这样的东西,它不需要类实现者额外的努力。他们在PythonJava以及许多其他语言中都有这个,但没有 C++。为了得到你想要的,你需要实现自己的对象系统,比如 IgKh 在他的回答中提到的元对象系统。

如果您想这样做,我建议您查看 JavaScript 如何实现对象。JavaScript 使用基于原型的对象系统,它相当简单,但也相当强大。我推荐这个,因为在我看来,如果你必须自己做的话,它会更容易实现。如果你有心情阅读关于原型的好处和优雅的冗长解释,你可以在 Steve Yegge 的博客上找到一篇关于这个主题的文章。他是一个非常有经验的程序员,所以我对他的意见有些信任,但我自己从来没有这样做过,所以我只能指出别人所说的。

如果您想保留更多 C++ 风格的类和实例,而不是不太熟悉的原型,请查看 Python对象序列化的工作方式。Python 也使用“属性”方法来实现其对象,但属性用于实现类和继承,而不是基于原型的系统,因此可能更熟悉一些。

抱歉,我没有更简单的答案来回答您的问题!但希望这会有所帮助。

于 2009-10-08T22:03:19.577 回答
1

我使用了ROOT 的 Reflex库,效果很好。它不是像您描述的那样使用疯狂的宏/模板解决方案,而是在构建时处理您的 C++ 头文件以创建反射字典,然后根据这些文件进行操作。

于 2009-11-06T15:25:15.143 回答