C++笔记-RTTR编译&安装&简单使用

本文以Linux为例,介绍RTTR 0.9.5版本的编译安装与使用。编译安装时,从官网下载后按官方流程操作,遇问题可切换root用户用cmake和make处理。使用方面,借助Qt的pro管理项目,参考官方例子展示手动注册、遍历成员等操作,并给出源码及下载地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里以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 ctor

constructor 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 registration
	registration::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 -= gui

CONFIG += c++11

TARGET = RTTRDemo
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += main.cpp


INCLUDEPATH += /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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值