这里以Linux为例,我使用的机器的gcc版本是4.9.2
使用的RTTR的版本是0.9.5
编译&安装
首先在官网将rttr的0.9.5版本下载下来。
Home |RTTR
按照官方的安装流程:
但这里可能会出现一个问题:
按照解答,切换成root用户,在rttr-0.9.5目录下直接cmake . 即可:
最后再进行make编译即可:
需不需要make install就看你们自己了,我没有install,后面的测试程序直接拷贝编译好的so进行处理。
使用
这里我使用了Qt的pro管理项目,qmake写起来比makefile简单点。
此处完全是参考官方给的例子:
1.手动注册:
#include <rttr/registration>
using namespace rttr;struct MyStruct { MyStruct() {}; void func(double) {}; int data; };RTTR_REGISTRATION
{registration::class_<MyStruct>("MyStruct").constructor<>().property("data", &MyStruct::data).method("func", &MyStruct::func);
}
2.遍历成员变量和成员函数:
type t = type::get<MyStruct>();
for (auto& prop : t.get_properties())std::cout << "name: " << prop.get_name() << std::endl;for (auto& meth : t.get_methods())std::cout << "name: " << meth.get_name() << std::endl;
3.构造类型:
type t = type::get_by_name("MyStruct");
variant var = t.create(); // will invoke the previously registered ctorconstructor ctor = t.get_constructor(); // 2nd way with the constructor class
var = ctor.invoke();
std::cout << var.get_type().get_name(); // prints 'MyStruct'
4.Set/Get属性:
MyStruct obj;property prop = type::get(obj).get_property("data");
prop.set_value(obj, 23);variant var_prop = prop.get_value(obj);
std::cout << var_prop.to_int(); // prints '23'
5.调用方法:
MyStruct obj;method meth = type::get(obj).get_method("func");
meth.invoke(obj, 42.0);variant var = type::get(obj).create();
meth.invoke(var, 42.0);
源码如下:
main.cpp
#include <rttr/registration>
#include <rttr/type.h>
#include <QDebug>
#include <iostream>
using namespace std;using namespace rttr;struct MyStruct{MyStruct(){};void func(double value){cout << "value: " << value << endl;};int data;
};int main(int argc, char *argv[]){qDebug() << "RTTR Demo";//manual registrationregistration::class_<MyStruct>("MyStruct").constructor<>().property("data", &MyStruct::data).method("func", &MyStruct::func);//iterate over members{type t = type::get<MyStruct>();for(auto &prop : t.get_properties())cout << "name: " << prop.get_name() << endl;for(auto &meth : t.get_methods())cout << "name: " << meth.get_name() << endl;}qDebug() << "---------------------------";//constructing type{type t = type::get_by_name("MyStruct");variant var = t.create();constructor ctor = t.get_constructor();var = ctor.invoke();cout << var.get_type().get_name() << endl;}qDebug() << "---------------------------";//Set/get properties{MyStruct obj;property prop = type::get(obj).get_property("data");prop.set_value(obj, 23);variant var_prop = prop.get_value(obj);cout << var_prop.to_int() << endl;}qDebug() << "---------------------------";//Invoke methods{MyStruct obj;method meth = type::get(obj).get_method("func");meth.invoke(obj, 42.0);variant var = type::get(obj).create();meth.invoke(var, 43.0);}return 0;
}
RTTRDemo.pro
QT += core
QT -= guiCONFIG += c++11TARGET = RTTRDemo
CONFIG += console
CONFIG -= app_bundleTEMPLATE = appSOURCES += main.cppINCLUDEPATH += /xxxx/xxxx/CFFPro/rttr-0.9.5-src/src
LIBS += -L/xxxx/xxxx/CFFPro/rttr-0.9.5-src/bin -lrttr_core
运行截图如下:
源码打包下载地址:
https://github.com/fengfanchen/Qt/tree/master/RTTRDemo