大多数成熟的C++项目似乎都有自己的反射和属性系统,即用于定义可以通过字符串访问的属性并且可以自动序列化.我参与的至少很多C++项目似乎重新发明了轮子.
你知道任何支持反射和属性容器的C++ 开源库,特别是:
通过宏定义RTTI和属性
通过代码访问RTTI和属性
自动序列化属性
听取属性修改(例如OnValueChanged)
小智.. 12
有一个新项目使用完全不同的方法在C++中提供反射:CAMP. https://github.com/tegesoft/camp
CAMP不使用预编译器,类/ properties/functions/...是使用类似于boost.python或luabind的语法手动声明的.当然,人们可以使用像gccxml或open-c ++这样的预编译器来生成这个声明,如果他们愿意的话.
它仅基于纯C++和boost头,并且由于模板元编程的强大功能,它支持任何类型的可绑定实体(例如,继承和奇怪的构造函数不是问题).
它是在MIT许可证(以前的LGPL)下分发的.
有一个新项目使用完全不同的方法在C++中提供反射:CAMP. https://github.com/tegesoft/camp
CAMP不使用预编译器,类/ properties/functions/...是使用类似于boost.python或luabind的语法手动声明的.当然,人们可以使用像gccxml或open-c ++这样的预编译器来生成这个声明,如果他们愿意的话.
它仅基于纯C++和boost头,并且由于模板元编程的强大功能,它支持任何类型的可绑定实体(例如,继承和奇怪的构造函数不是问题).
它是在MIT许可证(以前的LGPL)下分发的.
这是C++遇到Reflection时得到的:
无论你选择什么,它都可能有可怕的宏,难以调试代码或奇怪的构建步骤.我见过一个系统从DevStudio的PDB文件中自动生成序列化代码.
但严重的是,对于小型项目,编写保存/加载功能(或使用流式运算符)会更容易.实际上,这也可能适用于大型项目 - 显而易见的是,如果结构发生变化,您通常需要更改代码.
你可以看看下面的两个工具.我从来没有使用过它们中的任何一个,所以我不能告诉你它们是如何实用的.
XRTTI:
Xrtti是一个工具和附带的C++库,它扩展了C++的标准运行时类型系统,以提供更丰富的关于类和方法的反射信息集来操作这些类及其成员.
OpenC++:
OpenC++是C++前端库(词法分析器+解析器+ DOM/MOP)和源到源转换器.OpenC++支持开发C++语言工具,扩展,特定于域的编译器优化和运行时元对象协议.