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 库 ✅ 支持 高(复杂配置)
相关推荐
skywalk816321 小时前
CodeArts碰到问题:CodeArts 智能体使用失败,显示:会话创建失败,请稍后重试
开发语言·python
白露与泡影21 小时前
从区间锁到行锁:一次高并发写入死锁治理实战
java·开发语言
小短腿的代码世界21 小时前
VLC-Qt深度解析:Qt应用中的专业视频播放方案
开发语言·qt
丑八怪大丑21 小时前
Java范型
java·开发语言
加藤不太惠21 小时前
Nacos简单实用集群创建
java·开发语言·nacos
我能坚持多久21 小时前
C++的Vector学习:从功能探索到底层实现
开发语言·c++·学习
她说彩礼65万21 小时前
C语言 动态内存管理
c语言·开发语言·算法
傻啦嘿哟21 小时前
管好PPT的“骨架”:用Python控制页面与文档属性
开发语言·javascript·c#
凤凰院凶涛QAQ21 小时前
《C++转java快速入手系列》类与对象篇
java·开发语言·c++
时空系21 小时前
第8篇:模板与实例——面向对象编程入门(上)python中文编程
开发语言·python