RTTR: 一款MIT 协议开源的 C++ 运行时反射库

目录

1.简介

[2.安装 RTTR(源码编译,无预编译包)](#2.安装 RTTR(源码编译,无预编译包))

[3.项目集成(两种方式,推荐 CMake)](#3.项目集成(两种方式,推荐 CMake))

[3.1.CMake 项目集成(最简单,推荐)](#3.1.CMake 项目集成(最简单,推荐))

[3.2.手动集成(无 CMake)](#3.2.手动集成(无 CMake))

4.使用示例

[5.RTTR 核心常用功能](#5.RTTR 核心常用功能)

6.典型应用场景

7.技术对比(与主流方案对比)


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 库 ✅ 支持 高(复杂配置)
相关推荐
努力努力再努力wz11 小时前
【C++高阶数据结构系列】:时间轮定时器详解:原理分析与代码实现,带你从零手撕时间轮!(附时间轮的实现源码)
c语言·开发语言·数据结构·c++·qt·算法·ui
水饺编程11 小时前
编程基础:令牌粘贴指令,【##】
c语言·c++·windows·visual studio
Chen_harmony11 小时前
十九、数据在内存中的存储
c语言·开发语言
basketball61611 小时前
C 的 malloc/free 与 C++ 的 new/delete 一些区别
c语言·开发语言·c++
mmz120711 小时前
广搜题目练习(c++)
c++·算法
iiiiyu11 小时前
⾯向对象和集合编程题
java·大数据·开发语言·数据结构·编程语言
郝学胜-神的一滴11 小时前
Qt 高级开发 006: 架构全解 + 高效学习指南
开发语言·c++·qt·程序人生·架构
Achou.Wang12 小时前
Concurrency patterns - Go 并发模式
开发语言·后端·golang
存在morning12 小时前
【GO语言开发实践】三 GO 工程化快速上手
开发语言·后端·golang
雁迟12 小时前
第七章:R 向量用法(最核心数据结构)
开发语言·数据结构·r语言