比如:int (*foo)(int arg),記住要和另一個指針函數區分開來,類似這樣:int *foo(int arg).
比如我們可以這樣聲明一個變量和函數:
int (*pfun)(int arg)=0;
int fun(int arg); //這個函數實現隨便啦,我就不寫了。
如果我們想利用函數指針操作函數,就和指針變量使用一樣:
pfun=fun;
int result=(*pfun)(123);
對,很雞肋也沒必要。這是當然,因為我們沒用在對的地方。下面我要講的是利用一個類去call back另一個無關類的成員。
代碼:
#include <iostream>
using namespace std;
template<typename T,typename N>
class Functor{
public:
Functor(T *otherp,N (T::*otherfun)(N arg))
{
mp=otherp;
mfun=otherfun;
}
virtual N operator()(N arg)
{
return (*mp.*mfun)(arg);
}
private:
N (T::*mfun)(N arg);
T *mp;
};
class A{
public:
A(int a0):a(a0){}
int traced(int b)
{
cout<<"Trace a="<<a<<",b="<<b<<endl;
return 0;
}
private:
int a;
};
int main()
{
A a(10);
Functor<A,int> trace(&a,&A::traced);
trace(5);
return 0;
}
第33行把class A的成員函數地址傳給了Functor的函數指針,從而能夠通過Functor的成員處理A中的成員。
這里用到了對operator()的重載,可以換成別的函數處理Functor的函數指針
(不處理也行,但是函數指針很繞人,不直觀),像這樣:
#include <iostream>
using namespace std;
template<typename T,typename N>
class Functor{
public:
Functor(T *otherp,N (T::*otherfun)(N arg))
{
mp=otherp;
mfun=otherfun;
}
virtual N out(N arg) //改動
{
return (*mp.*mfun)(arg);
}
private:
N (T::*mfun)(N arg);
T *mp;
};
class A{
public:
A(int a0):a(a0){}
int traced(int b)
{
cout<<"Trace a="<<a<<",b="<<b<<endl;
return 0;
}
private:
int a;
};
int main()
{
A a(10);
Functor<A,int> trace(&a,&A::traced);
trace.out(5); //改動
return 0;
}
C++確實復雜,但是我們如果利用好,復雜就是強大。