2010-08-19 35 views
8

有沒有辦法爲C++類的每個方法創建一個指針列表(例如一個數組)?獲取類的方法列表

喜歡的東西Type.GetMethods()在.NET框架中,但僅使用標準的C++。

+7

除非你手工做。這是一個需要的可怕的事情。爲什麼? – GManNickG 2010-08-19 21:48:07

+0

@Gman:+1「可怕的東西需要」 – 2010-08-19 21:56:32

+0

@GManNickG爲什麼不能通過生成類的解析樹來生成C++類的方法列表? – 2013-03-12 03:56:38

回答

6

沒有這是不可能的一般方式。 C++沒有.Net擁有的相同元數據基礎架構。

您能否向我們提供您想要使用此信息的場景?有可能是一個更好的方法,您可以用C++

+0

現在,它只是出於好奇。我的意思是,昨天我正在考慮某種圖書館來處理JSON數據,但今天我不記得爲什麼我想到這種方法-_-。問題仍然存在,所以我問。 – 2010-08-19 21:57:31

+1

這是一個很好的說明,即使語法看起來相似,語言也是如此不同。兩種語言如何解決問題的心態完全不同。 – tenfour 2010-08-19 22:38:42

2

製作.h文件的副本,並在編輯器中對其進行破解。

不,沒有辦法自動完成。

0

沒有元類在C++中唯一對象和類,因此沒有反映無法參與使用,所以答案是否定的。

0

你可以使用typeid但不是方法的信息類型的信息。

3

沒有辦法。

事實上,即使在目標代碼級,靜態類的成員函數不能從一個獨立的功能區別,也沒有從指針傳遞到一個對象的獨立功能的類的實例的功能。

如果您知道您的編譯器名稱修改方案,並且可以訪問預先鏈接的目標代碼,那麼您可能可以對其進行解碼,但這對於iffy結果來說有很多工作要做。

+1

+1爲硬核「得到呃完成」的方法。 – tenfour 2010-08-19 22:24:35

1

如果你真的要做到這一點,的高級C++編程風格和習語詹姆斯Coplien第8章(可能是長,因爲絕版,但是我聽到了尼爾願意出售自己的副本便宜)涵蓋C++中的「範例」編程。不要錯,這個功能不是免費的,但它可以/提供類似於C++的元類功能。

隨口說說,我不記得他的建築你正在尋找到他的課的一個特定的功能,但它一直以來我仔細看了那本書在所有要麼很長一段時間。它總是可能它根本不能完成,但我認爲它會工作,如果你能忍受他披露的其他限制。

2

在我的項目,我使用的類成員聲明和定義特殊的宏,然後 我可以得到類成員的名單。例如:

類聲明:

#define DECLARE_MODULE_FUNCTION(function_name) \ 
JsonObject function_name(JsonObject value); 

#define DEFINE_MODULE_FUNCTION(function_name) \ 
static ModuleFunctionAdder<LotteryOddsModule> \ 
__LINE__##function_name(L ## #function_name , &LotteryOddsModule::function_name); \ 
JsonObject LotteryOddsModule::function_name(JsonObject value) 

template< typename T > 
class ModuleFunctionAdder; 

class LotteryOddsModule 
{ 
public: 
    typedef JsonObject (LotteryOddsModule::*ModuleFunction)(JsonObject); 

    JsonValue Invoke(JsonValue json_value); 

    DECLARE_MODULE_FUNCTION(GenerateK1AndK2); 

private: 
    friend class ModuleFunctionAdder<LotteryOddsModule>; 
    static std::map< WString , ModuleFunction > _module_functions; 
}; 

template<> 
class ModuleFunctionAdder<LotteryOddsModule> 
{ 
public: 
    ModuleFunctionAdder(WString func_name , LotteryOddsModule::ModuleFunction func) 
    { 
     LotteryOddsModule::_module_functions[ func_name ] = func; 
    } 
}; 

類定義:

JsonValue LotteryOddsModule::Invoke(JsonValue json_value) 
{ 
    return (this->*_module_functions[ L"GenerateK1AndK2" ]) (json_value.get_obj()); 
} 

DEFINE_MODULE_FUNCTION(GenerateK1AndK2) 
{ 
    //... 
}