C++ 模板函數指針


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) {}

      ......

 

例子程序:

View Code
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 }

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM