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) {}
......
例子程序:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }