我希望能够自省一个c++类的名称,内容(即成员及其类型)等。这里我说的是原生c++,而不是托管c++,托管c++有反射。我意识到c++使用RTTI提供了一些有限的信息。哪些附加库(或其他技术)可以提供这些信息?
当前回答
c++中还有另一个用于反射的新库,叫做RTTR(运行时类型反射,参见github)。
该接口类似于c#中的反射,并且不需要任何RTTI。
其他回答
你可以在这里找到另一个库:http://www.garret.ru/cppreflection/docs/reflect.html 它支持两种方式:从调试信息中获取类型信息和让程序员提供该信息。
我也对反思我的项目感兴趣,发现了这个库,我还没有尝试过,但尝试了这个家伙的其他工具,我喜欢他们的工作方式:-)
我建议使用Qt。
有一个开源许可证和一个商业许可证。
查看Classdesc http://classdesc.sf.net。它以类“描述符”的形式提供了反射,可以与任何标准c++编译器一起工作(是的,它可以与Visual Studio和GCC一起工作),并且不需要源代码注释(尽管存在一些处理棘手情况的pragmas)。它已经开发了十多年,并在一些工业规模的项目中使用。
在我的c++生涯中,我知道的两个类似反射的解决方案是:
1)使用RTTI,如果你能够从一个“对象”基类派生所有的类,它将为你提供一个引导来构建类似反射的行为。该类可以提供一些方法,如GetMethod, GetBaseClass等。至于这些方法是如何工作的,你需要手动添加一些宏来装饰你的类型,这些宏在幕后创建类型的元数据,为GetMethods等提供答案。
2)如果你可以访问编译器对象,另一个选择是使用DIA SDK。如果我没记错的话,这允许您打开pdbs,其中应该包含c++类型的元数据。也许足够做你想做的事了。例如,本页展示了如何获取类的所有基类型。
这两种解决方案都有点难看!没有什么比c++更能让你欣赏c#的奢华了。
祝你好运。
编辑:更新的坏链接截至2017年2月7日。
我想没有人提到这一点:
在CERN,他们使用c++的全反射系统:
欧洲核子研究中心的反射。看起来效果很好。
推荐文章
- cplusplus.com给出的错误、误解或坏建议是什么?
- 找出质数最快的算法是什么?
- 访问Handlebars.js每次循环范围之外的变量
- c++枚举类可以有方法吗?
- 格式化IO函数(*printf / *scanf)中的转换说明符%i和%d之间的区别是什么?
- 将析构函数设为私有有什么用?
- main()中的Return语句vs exit()
- 为什么c#不提供c++风格的'friend'关键字?
- 获取当前正在执行的方法的名称
- 在函数的签名中添加关键字
- 我如何在Visual Studio中预处理后看到C/ c++源文件?
- 为什么在标准容器中使用std::auto_ptr<>是错误的?
- 用比较double和0
- 保护可执行文件不受逆向工程的影响?
- 在c++中字符串前面的“L”是什么意思?