2009-05-20 530 views
4

有沒有辦法在C++或C中枚舉結構體(struct | class)的成員?我需要獲取成員名稱,類型和值。我之前在一個小型項目中使用了以下示例代碼,其中變量是全局範圍的。我現在遇到的問題是需要將一組值從GUI複製到對象,文件和VM環境。我可以創建另一個「窮人的」反思系統,或者希望能創造出我還沒有想到的更好的東西。有人有想法嗎?枚舉結構的成員?

編輯:我知道C++沒有反射。

union variant_t { 
    unsigned int ui; 
    int   i; 
    double  d; 
    char*   s; 
}; 

struct pub_values_t { 
    const char*  name; 
    union variant_t* addr; 
    char    type; // 'I' is int; 'U' is unsigned int; 'D' is double; 'S' is string 
}; 

#define pub_v(n,t) #n,(union variant_t*)&n,t 
struct pub_values_t pub_values[] = { 
    pub_v(somemember, 'D'), 
    pub_v(somemember2, 'D'), 
    pub_v(somemember3, 'U'), 
    ... 
}; 

const int no_of_pub_vs = sizeof(pub_values)/sizeof(struct pub_values_t); 
+0

C++沒有反射。請參閱http://stackoverflow.com/questions/359237/why-does-c-not-have-reflection – lothar 2009-05-20 15:25:34

回答

4

要說明明顯的是,在C或C++中沒有反射。因此,沒有可靠的枚舉成員變量的方法(默認情況下)。

如果您可以控制數據結構,則可以嘗試std::vector<boost::any>std::map<std::string, boost::any>,然後將所有成員變量添加到向量/映射中。

當然,這意味着所有的變量都可能堆在堆上,所以這種方法會帶來性能問題。使用std :: map方法,這意味着你會有一種「窮人的」反思。

2

Boost已準備好使用Variant庫,可能會滿足您的需求。

0

感覺就像你在構造某種調試器。我認爲這應該是可行的,如果你確保在生成可執行文件時生成pdb文件。

不確定在什麼情況下你想做這個枚舉,但在你的程序中,你應該能夠調用微軟的函數dbghelp.dll從變量等獲得類型信息(我假設你正在使用窗戶,這當然可能不是這樣)

希望這有助於讓你更進一步。

乾杯!

2

最簡單的方法 - 切換到Objective-C或Objective-C++。這些語言具有良好的內省,並且完全兼容C/C++源代碼。

另外,您可以使用m4/cog/...來同步生成結構,並從一些元描述中描述他的描述。

3

您可以在中間文件中指定您的類型並從中生成C++代碼,類似COM類可以從idl文件生成。生成的代碼爲這些類型提供反射功能。

我已經做了類似的兩種不同的方式爲不同的項目的東西:

  • 由Ruby腳本解析做代
  • 定義爲C#類型,使用C#的反射來獲取類型的自定義文件所有的信息,並從此生成C++(聽起來令人費解,但工作出人意料地好,編寫類型定義非常類似於編寫C++定義)
0

由於C++沒有內置反射,所以只能獲取信息n分別教你關於結構內容的程序。

這可以通過從可以使用的格式生成結構來了解結構信息,也可以通過解析.h文件來提取結構信息。