RTTR: 一款MIT 协议开源的 C++ 运行时反射库
目录1.简介2.安装 RTTR源码编译无预编译包3.项目集成两种方式推荐 CMake3.1.CMake 项目集成最简单推荐3.2.手动集成无 CMake4.使用示例5.RTTR 核心常用功能6.典型应用场景7.技术对比与主流方案对比1.简介RTTRRun Time Type Reflection是一款MIT 协议开源的 C 运行时反射库核心作用是让 C 程序在运行时内省、查询、动态调用对象的类型信息类名、成员变量、方法、构造函数等完美弥补 C 原生无反射机制的短板RTTR。核心特征能力维度具体支持技术亮点反射完整性类、构造函数、成员变量、方法、枚举、数组含多维 / 原生数组支持单 / 多 / 虚拟继承重载方法、可变参数、虚函数 / 抽象方法RTTR性能与安全编译期类型检查、零运行时开销、无额外依赖替代标准 RTTI跨动态库兼容比dynamic_cast更高效使用便捷性极简宏注册、CPP 文件内注册、无侵入设计无需代码生成工具 / 预处理器仅需 C11 标准RTTR扩展能力元数据支持、策略配置、默认参数可为反射对象附加元数据灵活调整绑定行为RTTR核心优势无侵入设计无需继承自基类仅需少量宏即可为第三方库添加反射能力。跨平台兼容支持 Windows/Linux/macOS编译器覆盖 VS 2013/GCC 4.8.1/Clang 3.7RTTR。轻量高效无第三方依赖无异常机制适配控制台等禁用异常平台编译时生成反射信息运行时零开销。动态解耦无需编译时依赖类型声明适合插件系统、动态模块集成RTTR。2.安装 RTTR源码编译无预编译包RTTR 是纯源码库必须自行编译步骤如下1.下载源码官方 GitHub 仓库稳定版git clone https://github.com/rttrorg/rttr.git # 或者直接下载zip压缩包解压2.CMake 编译配置创建编译输出文件夹避免污染源码cd rttr mkdir build cd buildWindowsVS 编译器# 生成VS工程默认32位如需64位加 -A x64 cmake .. # 如需指定VS版本 # cmake .. -G Visual Studio 17 2022 -A x64Linux / macOScmake ..3.编译 安装Windows打开build/rttr.sln选择Release模式推荐右键解决方案 → 生成右键INSTALL项目 → 生成自动安装到系统目录Linux / macOSmake -j4 # 编译 sudo make install # 安装到 /usr/local/3.项目集成两种方式推荐 CMake3.1.CMake 项目集成最简单推荐在你的项目CMakeLists.txt中添加cmake_minimum_required(VERSION 3.10) project(rttr_demo) # 设置C11 set(CMAKE_CXX_STANDARD 11) # 查找RTTR库 find_package(RTTR REQUIRED) # 添加可执行文件 add_executable(${PROJECT_NAME} main.cpp) # 链接RTTR库 target_link_libraries(${PROJECT_NAME} PRIVATE rttr_core)3.2.手动集成无 CMake把 RTTR 的include文件夹加入项目头文件路径把 RTTR 的库文件rttr_core.lib/rttr_core.dll加入项目链接运行时把dll/so/dylib放到程序同目录4.使用示例这是最简示例包含注册类 → 动态创建对象 → 读写属性 → 调用方法#include iostream #include rttr/registration using namespace rttr; // 1. 定义普通C类无需继承任何基类无侵入 class Person { public: Person() default; Person(std::string name, int age) : m_name(name), m_age(age) {} // 成员方法 void sayHello() { std::cout Hello! Im m_name , m_age years old.\n; } // 成员变量 std::string m_name; int m_age; }; // 2. 【核心】注册反射信息必须写在 .cpp 文件中 RTTR_REGISTRATION { registration::class_Person(Person) // 注册类指定名称 .constructor() // 注册默认构造 .constructorstd::string, int() // 注册带参构造 .property(name, Person::m_name) // 注册成员变量 .property(age, Person::m_age) .method(sayHello, Person::sayHello); // 注册成员方法 } // 3. 运行时使用反射 int main() { // -------------------------- // ① 通过名称获取类型 // -------------------------- type t type::get_by_name(Person); if (!t) { std::cout 类型未找到\n; return -1; } // -------------------------- // ② 动态创建对象 // -------------------------- variant obj t.create(Tom, 20); // -------------------------- // ③ 读写成员变量 // -------------------------- // 读取 auto name_prop t.get_property(name); std::cout 原姓名 name_prop.get_value(obj).to_string() \n; // 修改 name_prop.set_value(obj, Jerry); std::cout 新姓名 name_prop.get_value(obj).to_string() \n; // -------------------------- // ④ 动态调用成员方法 // -------------------------- auto method t.get_method(sayHello); method.invoke(obj); return 0; }输出原姓名Tom 新姓名Jerry Hello! Im Jerry, 20 years old.5.RTTR 核心常用功能1.枚举反射// 定义枚举 enum class Gender { Male, Female }; // 注册 RTTR_REGISTRATION { registration::enumerationGender(Gender) .value(Male, Gender::Male) .value(Female, Gender::Female); } // 使用 auto g type::getGender().get_enum_value(Male);2.静态方法 / 变量反射.class_Person(Person) .property(static_val, Person::static_val) .method(static_func, Person::static_func);3.跨动态库DLL/SO使用RTTR原生支持跨动态库反射只需插件 / 动态库中正常注册类主程序加载库后直接用type::get_by_name()获取类型6.典型应用场景插件系统动态加载插件并调用其类 / 方法无需提前知晓类型定义。序列化 / 反序列化自动将对象转为 JSON/XML无需手写序列化逻辑。UI 自动生成游戏引擎 / 工具编辑器中根据反射信息动态生成属性编辑界面如 ImGui 集成。脚本绑定将 C 类暴露给 Lua/Python/JavaScript 等脚本语言实现动态调用RTTR。依赖注入运行时动态创建对象并注入依赖简化大型架构组件管理。7.技术对比与主流方案对比方案反射方式依赖要求跨动态库性能上手难度RTTR手动注册 编译期生成仅 C11✅ 支持高零运行时开销低极简 APIC 原生 RTTI运行时类型识别无❌ 不兼容中dynamic_cast较慢极低内置语法Boost.Reflection模板 宏依赖 Boost 库✅ 支持中高复杂配置