2011-09-21 61 views
0

我想知道如何使用帶有函數指針的模板作爲參數。例如,使用具有函數指針參數的模板

template<typename T> someFunction(T /*?*/) {} 

其中T是一個函數指針(例如void (*)(int,int*,double)

我想用這種繞過差問題爲兩個函數函數指針如:

void function(int,int); 
void class::function(int,int); 

所以,如果函數指針不起作用,還有另一種方法嗎?

編輯:基本上,我需要做的是通過使用模板(就像一個普通模板函數接受各種變量)接受了多種功能的功能。

+1

你不能「搭橋之差」。沒有附帶的實例,成員函數沒有任何意義。另外,'class'是C++中的一個保留字。 –

回答

0

成員函數指針是一個不同的野獸比函數指針,例如有他們額外的this說法。它不完全清楚你想完成什麼,聽起來像Boost.Function/Bind會有幫助。注意它們是TR1以來的標準。

0

您可以使用函數而不是指向成員函數的指針。舉例:

class SomeFunctor { 
public: 
    void operator()(int i, int* ip, double d) 
    { 
    } 
}; 

void someFunction(int i, int* ip, double d) 
{ 
} 

template<typename T> 
void doSomething(T f) 
{ 
    int i = 0, j = 0; 
    int* ip = &j; 
    double d; 

    f(i, ip, d); 
} 

SomeFunctor someFunctor; 
doSomething(someFunctor); 
doSomething(someFunction); 

請注意,我沒有測試過這段代碼,因此可能需要進行一些修改才能編譯它。

0

你應該看看std :: function;這是一種持有「函子」的廣義方式,這是你可以調用的東西。 (參見npclaudiu對一種函數的例子的回答)

這就是說,K-ballo是正確的,成員函數與自由函數不同,因爲它需要一個對象。 這通常是通過傳入一個隱藏參數來實現的;你可以把它稱爲「this」。

所以,當你寫void my_class::function(int,int);

編譯器生成真正void my_class::function (my_class*,int,int);

您可以使用std ::綁定到數據和功能聯繫起來 - 創造在飛行仿函數。 ,我知道最好的教程是Boost.Bind