RTTR是一個C++庫,使程式員能夠在其應用程式中使用反射,RTTR是根據MIT許可證發布的,本文介紹如何集成rttr庫到工程中,并演示一個基本示例,
系統環境:windows
下載RTTR原始碼后,首先需要使用CMake進行構建,如果沒有安裝CMake,可以先下載并安裝,官方下載地址:https://cmake.org/download/,以windows64位msi安裝包為例:

rttr還依賴Boost庫和Doxygen,如果沒有這兩個可以先下載:
boost以windows平臺為例,選一種壓縮包下載:
https://www.boost.org/users/download/

下載好Boost以后解壓并配置環境變數BOOST_ROOT,值為解壓目錄,
Doxygen以windows平臺為例,這里我選擇了64位zip包:
https://www.doxygen.nl/download.html
下載好Doxygen以后解壓并在環境變數PATH中加入Doxygen的解壓目錄,
接下來下載rttr原始碼,官方下載地址:https://www.rttr.org/download,選擇windows版,以rttr目前最新版0.9.6為例:

解壓rttr原始碼壓縮包,并在根目錄中新建目錄build(名稱隨意,cmake將目標平臺的原始碼編譯到此目錄下):

打開cmake-gui,Browse Source選擇rttr原始碼根目錄,Browse Build選擇剛才新建出來的構建目錄,選擇好以后點擊Configure:

選擇專案的編譯器平臺,以Visual Studio 2019為例,選好以后點擊Finish:

等待CMake配置完成以后,再點擊Generate:

進入構建目錄下查看生成結果(本例中構建目錄為 rttr-0.9.6-src\build),用vs打開rttr.sln:

編譯rttr_core即可,本文以Release 64位為例進行編譯,注意字符集和平臺工具集等要和將來所集成的專案一致:

編譯好以后,庫檔案分別位于構建目錄下的:
lib/Release/rttr_core.lib
bin/Release/rttr_core.dll
接下來在命令列進入到構建目錄下,執行cpack命令,將在同目錄下生成最終的安裝包:


安裝包目錄結構及內容如下:

在vs2019中新建測驗專案,為了方便管理,我將剛才生成的安裝包目錄整體拷貝到測驗專案中(doc目錄不是必須),
配置測驗工程,以Release 64位為例,配置好附加包含目錄、附加庫目錄、附加依賴項、字符集(之前編譯rttr時使用的默認多位元組,如使用Unicode則編譯rttr時也改為Unicode):

運行需要元件rttr_core.dll,在生成后事件中加入
xcopy .\rttr-0.9.6-win64-\bin*.dll $(OutDir) /Y /E /F
將dll拷貝到exe目錄(也可以手動或者其他方式進行拷貝):

添加測驗代碼main.cpp,本示例中主要代碼取自RTTR官方首頁https://www.rttr.org/的入門示例:
#include <iostream>
#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);
}
int main() {
//遍歷類的成員
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;
//創建型別的實體
type t2 = type::get_by_name("MyStruct");
variant var = t2.create(); // 方式1
constructor ctor = t2.get_constructor(); // 方式2
var = ctor.invoke();
std::cout << var.get_type().get_name() << std::endl; // 列印型別名稱
//設定/獲取屬性
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() << std::endl; // prints '23'
//呼叫方法
MyStruct obj2;
method meth = type::get(obj2).get_method("func");
meth.invoke(obj2, 42.0);
variant var2 = type::get(obj2).create();
meth.invoke(var2, 42.0);
return 0;
}
編譯,運行結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/28750.html
標籤:其他
