C++中的模板 + 函數指針, 用來模擬 C# 中的 泛型代理 如: Action<T> Func<T,TResult>
C++ 中的函數指針定義 : typedef void (*Action)(int i) 這是定義了一個 無返回值,只有一個int 型參數的方法指針 ,
但如果我要使用一個 string 或 float 等其它參數類型的方法,就只能再定義一個函數指針.
C++ 中的模板函數定義 : template <class T> void Action(T) , 這樣就可以把參數類型做為參數傳給方法,但如果結合上面的
函數指什呢? 直接 template <class T> typedef void (*Action)(T) 是無法編譯通過的. (高手可以幫忙解釋下原因)
解決方法: 我們只需要把 函數指針封裝在一個模板的結構 或模板類里:
這種方法,比較適合做為參數進行傳遞.因為Action現在是一個類中的類型。.比如: void someFunction(Type<int>::Action action,int val) {action(val);}
template <class T>
struct Type {
typedef void (*Action)(T);
};
或是放到一個模板方法里 : 這種方法就是用一個方法調用一個函數指針. 其本身是一個方法.不適合做為參數傳遞.
// 也可以把這個函數指針放到一個模板方法里.
template <class T> void Func(void (*Action)(T),T val) {
Action(val);
}
這個Action 主要是用在方法參數中,做為一個 模析函數的指什 使用方法:
void someFunction(Type<int>::Action action) {}
void someFunction(Type<string>::Action action) {}
void someFunction(Type<double>::Action action) {}
......
例子程序:

1 #include <iostream> 2 3 using namespace std; 4 5 // 模板函數指針的定義 Type<T>::Action(T) 6 // 可以把這個函數指針放到類或者結構體里. 7 template <class T> 8 struct Type 9 { 10 typedef void (*Action)(T); 11 }; 12 // 也可以把這個函數指針放到一個模板方法里. 13 template <class T> void Func(void (*Action)(T),T val) { 14 Action(val); 15 } 16 17 // 具體的一個無返回值,有一個 Int參數的方法 18 void FunInt (int i) { 19 cout << "你輸入了整型數據 : " << i << endl; 20 } 21 // 具體的一個無返回值,有一個 String參數的方法 22 void FunString (string s) { 23 cout << "你輸入了字符串數據 : " << s << endl; 24 } 25 26 // 此方法的參數1,是調用一個 模板的函數指針 27 void _Func1 (Type<int>::Action action,int i) { 28 action(i); 29 } 30 31 // 此方法的參數1,是調用一個 模板的函數指針 32 void _Func2 (Type<string>::Action action ,string s){ 33 action(s); 34 } 35 36 int main() 37 { 38 // 將一個具體的函數傳入 39 _Func1(FunInt ,6678); 40 _Func2(FunString,"Hello World"); 41 // 模板方法里的函數指針 42 Func(FunInt,999); 43 Func<string>(FunString,"Kao 這也行..."); 44 return 0; 45 }