目录
[2.安装 RTTR(源码编译,无预编译包)](#2.安装 RTTR(源码编译,无预编译包))
[3.项目集成(两种方式,推荐 CMake)](#3.项目集成(两种方式,推荐 CMake))
[3.1.CMake 项目集成(最简单,推荐)](#3.1.CMake 项目集成(最简单,推荐))
[3.2.手动集成(无 CMake)](#3.2.手动集成(无 CMake))
[5.RTTR 核心常用功能](#5.RTTR 核心常用功能)
1.简介
RTTR(Run Time Type Reflection)是一款MIT 协议开源 的 C++ 运行时反射库,核心作用是让 C++ 程序在运行时内省、查询、动态调用对象的类型信息(类名、成员变量、方法、构造函数等),完美弥补 C++ 原生无反射机制的短板RTTR。
核心特征:
| 能力维度 | 具体支持 | 技术亮点 |
|---|---|---|
| 反射完整性 | 类、构造函数、成员变量、方法、枚举、数组(含多维 / 原生数组) | 支持单 / 多 / 虚拟继承,重载方法、可变参数、虚函数 / 抽象方法RTTR |
| 性能与安全 | 编译期类型检查、零运行时开销、无额外依赖 | 替代标准 RTTI,跨动态库兼容,比dynamic_cast更高效 |
| 使用便捷性 | 极简宏注册、CPP 文件内注册、无侵入设计 | 无需代码生成工具 / 预处理器,仅需 C++11 标准RTTR |
| 扩展能力 | 元数据支持、策略配置、默认参数 | 可为反射对象附加元数据,灵活调整绑定行为RTTR |
核心优势:
- 无侵入设计:无需继承自基类,仅需少量宏即可为第三方库添加反射能力。
- 跨平台兼容:支持 Windows/Linux/macOS,编译器覆盖 VS 2013+/GCC 4.8.1+/Clang 3.7+RTTR。
- 轻量高效:无第三方依赖,无异常机制(适配控制台等禁用异常平台),编译时生成反射信息,运行时零开销。
- 动态解耦:无需编译时依赖类型声明,适合插件系统、动态模块集成RTTR。
2.安装 RTTR(源码编译,无预编译包)
RTTR 是纯源码库,必须自行编译,步骤如下:
1.下载源码
官方 GitHub 仓库(稳定版):
git clone https://github.com/rttrorg/rttr.git # 或者直接下载zip压缩包解压
2.CMake 编译配置
创建编译输出文件夹(避免污染源码):
cpp
cd rttr
mkdir build
cd build
Windows(VS 编译器):
cpp
# 生成VS工程(默认32位,如需64位加 -A x64)
cmake ..
# 如需指定VS版本:
# cmake .. -G "Visual Studio 17 2022" -A x64
Linux / macOS:
cpp
cmake ..
3.编译 & 安装
Windows:
- 打开
build/rttr.sln - 选择 Release 模式(推荐)
- 右键解决方案 → 生成
- 右键
INSTALL项目 → 生成(自动安装到系统目录)
Linux / macOS:
cpp
make -j4 # 编译
sudo make install # 安装到 /usr/local/
3.项目集成(两种方式,推荐 CMake)
3.1.CMake 项目集成(最简单,推荐)
在你的项目 CMakeLists.txt 中添加:
cpp
cmake_minimum_required(VERSION 3.10)
project(rttr_demo)
# 设置C++11
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.使用示例
这是最简示例,包含:注册类 → 动态创建对象 → 读写属性 → 调用方法
cpp
#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! I'm " << m_name << ", " << m_age << " years old.\n";
}
// 成员变量
std::string m_name;
int m_age;
};
// 2. 【核心】注册反射信息(必须写在 .cpp 文件中!)
RTTR_REGISTRATION
{
registration::class_<Person>("Person") // 注册类,指定名称
.constructor<>() // 注册默认构造
.constructor<std::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;
}
输出:
cpp
原姓名:Tom
新姓名:Jerry
Hello! I'm Jerry, 20 years old.
5.RTTR 核心常用功能
1.枚举反射
cpp
// 定义枚举
enum class Gender { Male, Female };
// 注册
RTTR_REGISTRATION
{
registration::enumeration<Gender>("Gender")
.value("Male", Gender::Male)
.value("Female", Gender::Female);
}
// 使用
auto g = type::get<Gender>().get_enum_value("Male");
2.静态方法 / 变量反射
cpp
.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 | 手动注册 + 编译期生成 | 仅 C++11 | ✅ 支持 | 高(零运行时开销) | 低(极简 API) |
| C++ 原生 RTTI | 运行时类型识别 | 无 | ❌ 不兼容 | 中(dynamic_cast较慢) |
极低(内置语法) |
| Boost.Reflection | 模板 + 宏 | 依赖 Boost 库 | ✅ 支持 | 中 | 高(复杂配置) |