文件
REFL-CPP是一個僅標題庫,可為C ++提供編譯時反射和內省功能。通過在類型系統中編碼類型的元數據,REFL-CPP允許您通過ConstexPR和模板元編程處理類型及其字段和功能。
在您的項目中使用REFL-CPP?我想听聽:通過電子郵件與我聯繫(請參閱我的個人資料),打開問題或將#REFL-CPP標籤添加到您的主題中!
有問題嗎?嘗試在吉特頻道中詢問。
想支持refl-cpp嗎?考慮捐款。
REFL-CPP旨在提供一個通用反射系統,該系統足夠靈活,可以滿足您的需求,同時保持相對較小的API表面。
一些不錯的事情REFL-CPP支持開箱即用:
std::tuple與類型和成員描述符相關T的構建通用proxy<T>類型實現一個簡單的序列化系統- 示例serialization.cpp-在編譯器資源管理器中查看,從頭開始實現有效的通用序列化過程
簡單的SQL數據庫抽象- 示例dao.cpp-在編譯器資源管理器中查看一個基本ORM系統,該系統可以使用自定義屬性從模型類中從模型類生成SQL語句
帶有bases<>迭代基類- 示例inheritance.cpp-在編譯器資源管理器中查看內置bases<>屬性在類型的基類上迭代
運行時訪問反射信息- 示例custom-rtti.cpp-在編譯器資源管理器中查看REFL-CPP上的基本運行時抽象,該抽象通過自定義元數據在運行時訪問了對反射元數據的訪問
具有強類型屬性的基於XML的GUI-示例binding.cpp-通過在REFL-CPP頂部構建自定義運行時反射層,在編譯器Explorer中的視圖實現了用於使用REFL-CPP讀取XML資源的系統
實現通用構建器類工廠- 示例builders.cpp-編譯器資源管理器中的查看定義了通用builder<T>類,該類實現了任何類型T的構建器模式。
將字段轉換為訪問者方法- 示例 - proxy.cpp- compiler Explorer中的查看使用代理功能創建一個通用類型value_proxy<T> ,該功能通過訪問者方法來公開T的所有字段
將一系列結構視為數組的結構- 示例式our arrays.cpp- compiler Explorer中的視圖使用代理功能創建一個通用類型struct_of_arrays<T>將T的所有成員存儲在std::vector中,但也有一個T operator[](int)在demand上構造了單個對象,
生成std::optional成員的結構- 示例 - partials.cpp-查看編譯器資源管理器中的查看使用代理功能創建一個通用類型的partial<T>將T在std::optional中包裹T的所有成員
在高中的最後一年,我開始開發REFL-CPP。我本來應該在學習考試,但我剛剛讀過原始的靜態反思(2017)提案,並且意識到它並沒有很快到來之後,我決定不得不嘗試將盡可能多的這些功能塞入Compile-Time庫中。
自早期以來,圖書館就已經成長和改變了很多,但是即使幾年後,我仍然沒有看到另一個支持ConstexPR和模板元編程的反射庫。在其他庫中,您通常必須在運行時行走元數據結構,調用功能指針並使用Type-erisure。使用REFL-CPP,您可以在編譯時,通過for_each循環處理類型的元數據,所有類型都在那裡,並且編譯器通常會在所有內容上進行內聯插圖,並生成與手工編寫的相同代碼。
REFL-CPP中的所有實用程序函數均為constexPR(除了refl::runtime中的功能)。編譯器通常會在所有循環和其他構造(使用-O2時)內聯,並生成像手工編寫一樣快的代碼。
得益於一些特殊的編譯時間優化,當不使用類型本身時,通常不會實例化元數據(不需要代碼 - 類別)。使用0.12.2,使用屬性#60時,彙編時間也有一些重大減少。
話雖如此,這是一個謹慎的話:我觀察到,在250個反射成員標記之後,彙編時間開始迅速增長。如果您的代碼庫包含許多大型類(+250個功能),並且您需要將它們全部與refl-cpp反映,則在使用之前,這可能是一個斷路器 - 基準。
要使用refl-cpp作為單頭庫,請include/refl.hpp to您的include目錄。
您也可以將REFL-CPP作為CMAKE依賴性消費(需要3.14+,謝謝@friendlyanon)。
vcpkg install refl-cpp (感謝@vennor)conan install refl-cpp在線文檔是用doxygen構建的。在docs/中運行doxygen Doxyfile進行更新。
使用-Drefl-cpp_DEVELOPER_MODE=ON運行cmake,並實現refl-cpp-tests目標。
使用-Drefl-cpp_DEVELOPER_MODE=ON Flag運行CMAKE。您可能還需要設置自定義預設,以獲得更便捷的開發人員體驗(請參閱#44上的評論)。