指向一般函數的指針可實現對參數類型、參數順序、返回值都一樣的函數進行封裝,指向類的成員函數的指針可實現對一個類中的參數類型、參數順序、返回值都一樣的函數進行封裝。對於函數之前,前面已經進行了討論,該文章的鏈接為:http://www.BkJia.com/kf/201111/112430.html
那麼,如何能實現對不同類的成員函數進行統一調用呢?我們首先想到的應該會是函數模板和類模板。
下面就一個例子來說明如何實現對不同類的函數成員函數指針的調用。
#include <iostream.h>
class CA
{
public:
int Sum(int a, int b)
{
return a+b;
}
};
class CB
{
public:
float Sum(float a, float b)
{
return a+b;
}
};
template <typename ClassType, typename ParaType>
class CC
{
public:
/*函數指針類型模板*/
typedef ParaType (ClassType::*pClassFun)(ParaType, ParaType);
/*函數指針函數模塊*/
ParaType Result(ClassType* pClassType, pClassFun fun, ParaType a, ParaType b)
{
return (pClassType->*fun)(a, b);
}
};
void main()
{
/*測試整型*/
CA ca;
CC<CA,int> cc;
int a = 3;
int b = 4;
cout<<"The sum of a and b is "<<cc.Result(&ca, CA::Sum, a, b)<<endl;
/*測試浮點型*/
CB cb;
CC<CB,float>fcc;
float fa = 3.3f;
float fb = 4.6f;
cout<<"The sum of fa and fb is "<<fcc.Result(&cb, CB::Sum, fa, fb)<<endl;
}
總結:
1、指針函數模板的使用需要結合類模板和函數模板。
2、類模板中的函數模板的定義必須位於頭文件,或者和調用函數位於同一文件,且在調用函數的上方,否則會出現編譯錯誤。
摘自:http://www.cnblogs.com/xianyunhe/archive/2011/11/27/2265148.html