原创文章,未经许可,禁止转载!

1 初识rttr


1. 介绍

rttr全称 Run Time Type Reflection ,是c++的一个运行时反射库。rttr的代码可以说是一场个人show,功能强大,代码花哨,作者将C++11/14的特性使用的淋漓尽致。如果你是一个C++新兵,我不建议你直接研究下面的代码,会搞得你晕头转向,而且大多数人写代码的时候也不会这样去写。

目前最新的master版本作者还在不断的更新修改,因此这次源码解读就选用了0.96的稳定版。

2. 代码下载

rttr的官网地址:https://www.rttr.org ,里面有相关的文档和源代码的zip包下载。官方的github地址: https://github.com/rttrorg/rttr 。下载0.96的包或者checkout 0.96的tag,再用CMake的默认选项生成工程即可。我在vs2015,vs2017,vs2019,mac还有Ubuntu上默认选项都可以直接编译。

3. 工程列表

用VS打开以后可以看到如下工程,其中rttr_core就是核心模块,整个反射功能都是依靠这个模块工作的。json_example是一个利用rttr反射制作的json序列化和反序列化的返利,unit_tests是rttr所有组件的测试用例。unit_test_plugin是插件的测试用力。这些测试用例和范例已经详细的说明了rttr的使用方法,可以参考。

rttr工程

4. 类文件的定义

因为rttr大量的使用模板,所以只能在头文件里面实现,但是头文件之间又有着相互的依赖关系(include顺序),所以rttr中的类文件的定义一般有3个文件:

  • xxx.h 这个文件里面主要存放的是类和函数的定义。
  • xxx_impl.h 这个文件里面是类成员函数的实现。
  • xxx.cpp 这里面主要放的是不具备模板信息的实现。

5. 初识type类

type类是rttr一个最基本的Class,他的作用是用来记录各种不同类型的类型信息,每一种类型都有一个type实例,同样类型的对象或者instance所对应的type对象也是同一个。获取type实例的方法是调用 rttr::type::get<类型>(),调用过程主要通过一个static的type实例来保存类信息。如果是第一次调用会创建这个类信息,并且返回,如果是第二次调用的话就直接返回这个static的实例。 其实真正存放类型信息的是type_data,通过 make_type_data 函数创建。

type实例获取

有了type类,对应的对象就可以的类型信息就可以擦除了,擦除以后的数据就依靠 variant 和 argument 来进行传递了。

发表评论