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

news2024/12/22 23:41:44

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1149120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

医学手术麻醉临床信息系统源码

手术麻醉临床信息系统遵循“以病人为中心、服务于临床”的宗旨&#xff0c;使医护人员从繁琐的病历书写中解放出来&#xff0c;集中精力关注病人的诊疗&#xff0c;将更多的时间用于分析、诊断。以服务围术期临床业务工作的开展为核心&#xff0c;为医护人员、业务管理人员、院…

高级工技能等级认定---网络设备安全

目录 一、DHCP 安全配置 二、SSH配置 三、标准ACL的配置 四、配置交换机端口安全 五、三层交换和ACL的配置 一、DHCP 安全配置 配置要求&#xff1a; 1.给交换机配置enable密码. 2.在交换机上创建VLAN 100&#xff0c;将F0/1-3口改为Access口&#xff0c;并加入到VLAN …

【LeetCode刷题-哈希】--706.设计哈希映射

706.设计哈希映射 class MyHashMap {private class Pair{private int key;private int value;public Pair(int key ,int value){this.key key;this.value value;}public int getKey(){return key;}public int getValue(){return value;}public void setValue(int value){this…

Win10安装WSL2和ubuntu

目录 一、win10系统设置 二、安装WSL 三、win10中ubuntu迁移到D盘 四、在vscode中访问ubuntu 在win10中安装WSL2虚拟机&#xff0c;然后安装ubuntu&#xff0c;最后使用vscode连接ubuntu。教程适用于&#xff1a; ubuntu22.04ubuntu20.04ubuntu18.04 一、win10系统设置 …

大型微服务架构智慧工地云平台源码(SaaS模式)

智慧工地云平台建设是采用先进的移动互联、物联网、云计算、大数据等新一代信息技术&#xff0c;主要由信息采集层、网络接入层、网络传输层、信息储存与处理层组成&#xff0c;主要包括云管理平台、综合管理系统、质量管理系统、安全管理系统等模块。施工管理人员可通过PC端&a…

欧姆龙PLC与上位机通讯说明

欧姆龙PLC与上位机连接时一般采用的是Hoslink协议&#xff0c;它是一种简易经济的通讯方式&#xff0c;比较适合一台上位机和一台PLC或者多台PLC进行通讯。上位机可对漂亮C进行程序传送和读写等操作。HOSTLINK系统允许一台上位机通过上位机链接命令向HOSTLINK系统的PLC发送命令…

MyBatis-Plus 实战教程三 拓展插件

文章目录 扩展功能代码生成安装插件使用 静态工具逻辑删除通用枚举定义枚举配置枚举处理器测试 JSON类型处理器定义实体使用类型处理器 仓库地址 扩展功能 代码生成 在使用MybatisPlus以后&#xff0c;基础的Mapper、Service、PO代码相对固定&#xff0c;重复编写也比较麻烦。…

鸿蒙开发第一步-入门

本人安卓开发小趴菜一枚&#xff0c;在现公司做中控产品&#xff0c;目前通过 Java,Kotlin开发&#xff0c;但是随着后面可能会用到华为产品(后续华为可能不支持安卓)做中控设备&#xff0c;所以在领导的建议下&#xff0c;入手鸿蒙开发。 先说下中控产品吧&#xff0c;以pad开…

线扫相机DALSA-相机平场矫正详细步骤

在相机视野下铺放白色亚克力板或纯白纸&#xff0c;采集图像。打开曲线图。 选择 Line Profile 模式。调节好相应所需的曝光时间、光源、增益和镜头光圈&#xff0c;让白平衡纸显示出来的灰度值大概在 150-200 左右。 在Calibration Algorithm 中将显示的数值设置好。 先暗场…

NodeJS回调地狱及Promise优化

NodeJS中有很多异步API&#xff0c;比如常见的fs模块的readFile方法。虽然有同步的版本readFileSync, 但是其性能肯定不如前者。所以这里从异步异步版本readFile说起: const fs require(fs);fs.readFile(./a.txt, utf-8, function(error, data) {if (!error) {console.log(a.…

目标检测理论知识

目标检测 1.基本概念 目标检测&#xff08;Object Detection&#xff09;的任务是找出图像中所有感兴趣的目标&#xff08;物体&#xff09;&#xff0c;确定它们的类别和位置&#xff0c;是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态&#xff0c;…

【Linux】深入理解系统文件操作(1w字超详解)

1.系统下的文件操作&#xff1a; ❓是不是只有C\C有文件操作呢&#xff1f;&#x1f4a1;Python、Java、PHP、go也有&#xff0c;他们的文件操作的方法是不一样的啊 1.1对于文件操作的思考&#xff1a; 我们之前就说过了&#xff1a;文件内容属性 针对文件的操作就变成了对…

AI:43-基于深度学习的昆虫图像识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…

AI:42-基于机器学习方法下以沙发为例的家具风格识别技术研究

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…

【AD9361 数字接口CMOS LVDSSPI】C 并行数据 LVDS <续>

续【AD9361 数字接口CMOS &LVDS&SPI】C 并行数据之LVDS 不同于CMOS的传输方式&#xff0c;lvds只能工作在双端口全双工模式下。 一、 双端口全双工模式 &#xff08;LVDS&#xff09;代称 DFL DUAL PORT FULL DUPLEX MODE DFL 模式通过写入SPI寄存器实现。在此模式下…

html+js+css实现一个圆形滑块

htmljscss实现一个圆形滑块&#xff0c;可以拖动&#xff0c;可以点击&#xff0c;先看效果再讲原理&#xff0c;最后附上源码&#xff1a; 产品经理设计了这样一个需求&#xff0c;通过拖动圆形滑块实现时间的设置功能&#xff0c;虽然看着有点复杂&#xff0c;但是确实有点复…

vite+vue3实现 tomcat 的本地部署

背景&#xff1a; 很多开发小伙伴在本地开发完前端项目后&#xff0c;碍于服务端环境配置麻烦&#xff0c;想先试试在本地部署&#xff0c;已开发好的前端项目&#xff0c;由于很多文章都是文字性描述&#xff0c;不太直观&#xff0c;为了给大多数新手提供一个教程&#xff0c…

Agent 应用于提示工程

如果Agent模仿了人类在现实世界中的操作方式&#xff0c;那么&#xff0c;能否应用于提示工程即Prompt Engingeering 呢&#xff1f; 从LLM到Prompt Engineering 大型语言模型(LLM)是一种基于Transformer的模型&#xff0c;已经在一个巨大的语料库或文本数据集上进行了训练&…

ubuntu 22.04 源码安装 apollo 8.0

对于其他的关于GPU的安装包需求&#xff0c;这里不再列出&#xff0c;因为我之前安装过&#xff0c;偷个懒就不写了&#xff0c;哈哈哈哈1, 安装docker 安装docker命令(这里的安装命令都是在docker官网,还有安装包)&#xff1a; 1&#xff0c; 设置docker的apt仓库 # Add Do…

论坛搭建.

目录 一.配置软件仓库 二.安装http php miriadb 三.配置数据库 一.配置软件仓库 1.进入仓库目录 cd /etc/yum.repos.d 2.创建仓库文件 vim local.repo 3.在 local.repo中写入:(粘贴的时候注意位置) [biaoshi] 仓库标识符 namemiaoshu …