2016-09-26 140 views
-1

我有一堆類具有相同的靜態方法名稱parse。我想創建一個通用函數,爲泛型類調用parse我可以通過名稱調用類的靜態方法嗎?

我可以使用類的字符串名稱調用方法,還是可以將該類作爲函數參數傳遞?

+0

你當然可以使用模板元編程;但恐怕你正在考慮像Java/C#中的某種運行時反射,這在C++中根本無法實現。 –

+0

無法真正通過C++中的類。有一些你可以玩的模板遊戲,但是你最好走老派並傳遞一個指向靜態方法的指針。需要更多關於你想要知道的信息。 – user4581301

+0

那麼他所說的反射級別(按名稱調用函數)在C++中顯然是可能的。無論如何,如果他不得不問這個問題,我不會推薦走這條路。爲什麼不只是像IParser {virtual void parse()= 0; }並讓每個類實現IParser。那麼你的泛型函數將會是簡單的無效解析(IParser & p);或者你需要的。 如果你還需要別的東西,你需要更具體地說明你想要這樣的東西是如何工作的 –

回答

-1

你只需要使用scope resolution operator ::與公開它的類名來限定方法:

類::方法();

+0

不是downvoter,但他不是簡單地問'你怎麼稱呼靜態功能' – George

0

在我看來,這個問題非常廣泛。我不確定你到底是什麼,但這裏有一些選項:

有一個像所有子類必須實現的常見接口,如IParser(在這種情況下,一個方法解析)。你可以有一個功能需要IParser &。

如果你真的像'某個名稱的呼叫'之類的某種形式的RPC比我會建議另一種方法,你必須手動註冊函數到某種需要一個指針函數作爲值的映射,和類的名稱作爲關鍵。比調用這個函數更容易map[fnName]();

0

C++沒有內置的反射機制。如果您對通過其字符串表示法調用方法感興趣,則需要親自處理name -> method pointer映射。在這種情況下,std::unordered_mapstd::stringstd::function可能會有所幫助。

示範性的C++代碼11:

#include <iostream> 
#include <unordered_map> 
#include <string> 
#include <functional> 

struct Foo { 
    static std::unordered_map<std::string, std::function<void(void)>> functions; 
    static void bar() { 
     std::cout << "Foo::bar called" << std::endl; 
    } 

    static void init() { 
     functions["bar"] = &Foo::bar; 
    } 
}; 

std::unordered_map<std::string, std::function<void(void)> Foo::functions; 

int main() { 
    Foo::init(); 
    Foo::functions["bar"](); 
} 

然而,如果你不感興趣的字符串調用方法只有你想打電話給定名稱的具體方法,你可以使用模板玩:

#include <iostream> 

struct foo { 
    static void bar() { 
     std::cout << "foo::bar called" << std::endl; 
    } 
}; 

template <class T> 
struct tag{}; 

template <class T> 
void call_bar(tag<T>) { 
    T::bar(); 
} 

int main() { 
    call_bar(tag<foo>{}); 
} 
相關問題