C++ 反射指南/教程

标签 c++ reflection c++11

我发现无论如何都很难在 C++ 中实现反射。我只看过 AGM::LibReflection 和 Game Programming Gems 5 中的示例。有人知道如何执行此操作的教程或代码示例吗?

到目前为止,我知道 Boost/QT 的内置系统,但我不想使用他们的系统(请不要妨碍它,我发现它臃肿,我想自己动手,不要偏离主题)。

最佳答案

反射是一种检查程序属性的糟糕方法。您只能“反射(reflect)”设计编译器的人连接到反射机制中的内容。这通常不是很多(您知道什么反射系统可以让您查看表达式内部?)并且它取决于语言。对于像 C++ 这样的东西,你试图在语言的 top 上添加反射,本质上是作为一组 API,你将受到极大限制,或者你将不得不以真正生硬的风格编写代码这让您实际上可以将反射数据声明为标准数据结构。

您可以改用 program transformation engine (PTS) .这样的引擎操纵完整的程序表示,因此可以从技术上回答任何可回答的问题。特别是它原则上可以回答所有你能想到的反射问题,因为它充当了编译器的替代者,能看到编译器看到的一切。 (事实上​​ ,它可以看到比编译器看到的更多;编译器一次只能看到一个编译单元,一个好的 PTS 可以同时看到任意大的一组编译单元,因此可以回答有关整个集合的问题)。

我们的 DMS Software Reengineering Toolkit可以解析完整的(和许多方言的)C++,构建 AST 和准确的符号表。使用它,您可以实现任何静态可计算反射,然后使用它来生成分析结果或直接修改 AST。

DMS 与语言无关;它可以为多种语言执行此操作。

关于实际使用 DMS 进行“反射”:OP 想知道如何实现属性 getter 和 setter。使用像 DMS 这样的 PTS,您可以解析感兴趣的类的源代码,然后遍历代码的 AST。对于类中的每个数据声明,您实际上是通过构建表示 getter 代码的 AST 来为该数据制造一个 getter;对于像 DMS 这样的工具,您可以通过组合 C++ 源代码的模式来实现这一点,这些模式被解释为表示相应的 AST 片段,并带有可以用其他 AST 填充的占位符。次要转换可以修改原始 AST 以包含生成的 getter/setter;这会生成一个包含原始代码和生成的 getter/setter 的 AST。最后一步是从 AST 重新生成代码,DMS 通过使用 AST-to-source prettyprinters 来完成,这些 prettyprinters 是构成语言(例如 C++)前端的“域定义”(解析器、prettyprinter、名称解析器)的一部分结束。

关于C++ 反射指南/教程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5086604/

相关文章:

c++ - map 运算符 < 条件 - 无效比较器

c# - 记录对象的状态。获取其所有属性值作为字符串

c++ - lambda 函数是否需要任何头文件?

c++ - 如何使用模板处理多类型变量?

c++ - CMake 添加(测试)可执行文件

c++ - WebView2 中的新 Sec-* header

c++ - 使用::std::vector 创建数组

C# 反射 : Replace a referenced assembly

java - 为什么在子类重写时,我通过反射获取基类方法?

c++ - 从 Howard Hinnant 的日期库中提取日期和时间