如何實現一個C++反射庫?

RT....感覺很難...C++語言層面不支持反射的特性...VS也沒開放cl的API讓我們可以調用編譯時生成的AST信息

目前思路是類似QT的方法.在預處理器前面做個元數據處理器,在函數,類上打標記,分析出元數據信息,插入到源碼中.


如果你用的是Visual Studio的話,你可以在安裝目錄下搜到一個dia100.dll/dia110.dll/dia120.dll,這個庫可以用來讀pdb文件。你只要稍微研究一下就可以拿到編譯的時候生成的類型信息了。然後你根據這些信息再codegen出一份代碼,合併進去編譯。debug的時候隨便搞,你在寫release腳本的時候只要編譯你的程序兩遍就可以得到反射了。

這是所有已知的方法裡面最容易完成的。下面的博客裡面提到的PdbDump的代碼你可以在我的www.gaclib.net 的代碼gac.codeplex.com 下找到,名字一樣,下載下來搜一下就有了。

使用VS API開發一個PDB Dumper並且可以在沒裝VS2010的計算機上運行

合併Visual Studio本地C++XML注釋文檔和PDB的符號內容


對反射這東西一知半解,說錯了大神們不要打我。

按照我所了解的反射,完全可以用std::map+boost::any模擬出來,這方法不是我發明的,實在一個群裡面看到有人說的。

簡單來說就是給類加個std::map&類型的成員變數,雖然用起來覺得有點彆扭,但是完全可行,而且可以跨平台,不過因為C++的ABI問題不能跨編譯器。

boost::any是個挺有意思的東西,他可以保存任何類型的東西,當初看這玩意的源碼還學了個技巧,雖然現在完全不記得學了個啥技巧了。


題主可以看看 MFC 的 CObject 及 CRuntimeObject 相關實現。理解了 MFC 的思路後,可以自己仿照實現。我曾經按照這個思路嘗試寫過一點,能做到命令行輸入任何類名(要求是用了反射機制的類),程序能反射給出類的完整繼承關係,並能實例化出繼承樹上的任意類對象(要求有預設構造方法)。


用protobuf吧,跨平台,代碼生成速度比反射速度快。

meta信息可以通過為protoc編寫插件(任何語言都可以)獲取欄位信息和注釋來做,非常方便。

我們曾經用protobuf結合qt做編輯器,反射功能很方便


利用工廠方法 創建之前先寫入緩存

當然這樣麻煩 而且會降低速度


看這個 ccsdu2004/BGE

我之前寫的一個GUI library

內置幾個基於xml的反射庫


工廠模式+std::map足以


推薦閱讀:

如何勸說上級更新 GCC 和 VS 的版本,並把項目遷移至 C++11?
關於C++虛函數表構造?
是否有去除c++多餘頭文件的工具?
C/C++編譯器是否會無條件消除空函數調用?

TAG:C | 編譯原理 | 編譯器 |