2011-09-03 109 views
4

如何將函數指針作爲模板寫入?函數指針作爲模板

template <typename T> 
T (*PtrToFunction)(T a); 
+3

這無異於一個「模板的typedef」,這不存在。在C++ 11中,你有模板別名,但我不確定他們是否覆蓋了這種情況。 –

+1

如果您的應用程序的大小有保證,請使用更通用的函子對象,如[Boost.Function](http://www.boost.org/doc/libs/1_47_0/doc/html/function.html),它允許您使用任何類型的可調用對象,而不僅僅是函數指針。如果你正在編寫一個小應用程序,不要打擾。 –

回答

5

如果你的意思是創建該功能的類型,你可以做這樣的事情:

template<typename T> 
struct Function { 
    typedef T (*Ptr)(T); 
}; 

然後使用它像

int blah(Function<int>::Ptr a) { } 
8

我假設你正在努力申報一個類型(你不能聲明一個沒有具體類型的「模板變量」)。

C++ 03沒有模板的typedef,你需要使用一個結構作爲一種解決方法:

template <typename T> 
struct FuncPtr { 
    typedef T (*Type)(T a); 
}; 

... 

// Use template directly 
FuncPtr<int>::Type intf; 

// Hide behind a typedef 
typedef FuncPtr<double>::Type DoubleFn; 
DoubleFn doublef; 

C++模板11別名將消除結構的解決方法,但除了Clang目前沒有編譯器實際執行這個。

template <typename T> 
typedef T (*FuncPtr)(T a); 

// Use template directly 
FuncPtr<int> intf; 

// Hide behind a typedef 
typedef FuncPtr<double> DoubleFn; 
DoubleFn doublef; 
+0

只需更新這個舊條目即可提及自GCC 4.7起,GCC現在支持模板別名。 –

0

你不能那樣做。您只能創建具體類型的函數指針。

0

這是對的Visual Studio 2015年確定並在GCC你應該使用命令行選項-std=c++11

template<class T> using fpMember = void (T::*)();