2011-11-16 155 views
3

我在類「C」以下功能C++指針模板函數類成員

class C 
{ 
    template<typename T> void Func1(int x); 
    template<typename T> void Func2(int x); 
}; 

template<typename T> void C::Func1(int x) 
{ 
    T a(x); 
} 

template<typename T> void C::Func2(int x) 
{ 
    T a(x); 
} 

的功能僅在實現使用模板。簽名不包含模板參數。

是否可以定義指向這些模板函數的指針?

我嘗試了以下定義,但它導致編譯錯誤。

typedef template<typename T> void (СSomeClass::*TFuncPtr)(int);

+0

它沒有typedef的工作嗎? – duedl0r

+0

停止將它們稱爲模板函數。他們是功能模板。它確實有所作爲(不,我不願意向不接受答案的人解釋)。 –

+0

Jan非常感謝您的回答,它非常有用。 –

回答

8

一旦被實例化,成員函數模板只是一個普通的成員函數,這樣你就可以使用普通的成員函數指針(最好typedef倒是像下圖):

typedef void (C::*mem_fun_ptr)(int); 
mem_fun_ptr p = &C::Func1<Bar>; 
//   IMPORTANT -- ^^^^^ 

下劃線部分是重要部分。您不能創建指向函數模板的指針,但可以創建一個指向函數模板的指針。

2

你只想要一個函數指針嗎? 這很簡單:

class C 
{ 
public: 
    template<typename T> void Func1(int x); 
}; 

typedef void (C::*TFuncPtr)(int); 

int main() 
{ 
TFuncPtr ptr = &C::Func1<int>; 
} 
如果你想要別的東西

你能告訴您要使用的指針的例子嗎?

+0

你的回答完全符合我的問題。謝謝。 –

+0

http://stackoverflow.com/faq#howtoask閱讀有關接受答案的部分:「當您決定哪個答案對您最有幫助時,通過單擊左側的複選框輪廓將其標記爲接受的答案答案。」 – jmsu

+0

如果我以模板的形式返回值,以及如何處理它,該怎麼辦? – ColdSteel