今天寫引擎的時候,很想加入一些回調(diào)函數(shù),以前一直沒時間整理這塊,這次一定要下決心好好整整代碼,純粹用多態(tài),很多類非要加個帽子,類之間的關(guān)系也顯的很單一,有的情況需要用到委托的回調(diào)機(jī)制,這是個很好的東西,在C#里面是原生支持的,C++里面本來函數(shù)指針是個不錯的選擇,可到了對象里面,成員函數(shù)指針還有那么好用嗎?這原本是另C++程序員非常失望和無賴的,難道一說到成員函數(shù)指針就真的那么不好用,甚至要淪為被唾棄的命運(yùn)?并非入此,別忘了,C++里面還有很強(qiáng)的利器,C#和Java后天才具備的特性可是C++先天就具備的哦,那就是范型,C++里面的用的是模版,而且如果把 模版和成員函數(shù)指針結(jié)合在一起,那就威力無比了,那應(yīng)該叫做就是“成員模版函數(shù)指針”,C++的教科書上有這個名詞嗎?我查了查,好像是沒有,而且網(wǎng)上很多資料竟然說這個不能實(shí)現(xiàn)之類的話,我都懷疑那些如此斷言的人是否太不負(fù)責(zé)仁了,誤導(dǎo)人啊。
當(dāng)然指想成員函數(shù)的指針,這里面的確有段C++設(shè)計的問題,C++的成員函數(shù)地址通過對象外去引用不能直接通過“&對象.方法”的方式來引用,這個在C++標(biāo)準(zhǔn)里面是沒有的,很多人到這里就絕望了,可間接引用呢?而且用很優(yōu)雅的方式來引用呢?
好了,我也不繞圈子了,給出我的代碼,一個簡單的 “成員模版函數(shù)指針” 的實(shí)現(xiàn),看看C++是如何優(yōu)雅的實(shí)現(xiàn)委托的,真的非常非常的優(yōu)雅,由于完全自己摸索出來的,真是感慨萬千啊。
#include "stdafx.h"
#include <iostream>
using namespace std;
template<typename T>
class A
{
private:
typedef int (T::*delegateFun)(int);
T * _This;
delegateFun _deleGate;
public:
//This被代理的對象, delegateFun被代理的方法
A(T * This, int (T::*delegateFun)(int))
{
_This = This;
_deleGate = delegateFun;
}
//c被代理的參數(shù)
int execue(int c)
{
return (_This->*_deleGate)(c);
}
};
class B
{
public:
int FunA(int a) {return a + 10;}
int FunB(int a) {return a - 10;}
B()
{
}
};
int _tmain(int argc, _TCHAR* argv[])
{
B *objB = new B();
A<B> delegateObj1(objB, (&B::FunA));
A<B> delegateObj2(objB, (&B::FunB));
cout << delegateObj1.execue(10) <<endl;
cout << delegateObj2.execue(20) <<endl;
return 0;
}
看完了感覺如何?以后想要設(shè)計一個callback回調(diào)函數(shù)是否明朗了許多?
再也不需要強(qiáng)行搞個static約束方法,那么惡心的東西了吧