[C/C++]完整揭祕VS2010關於function和bind的實現

好久以前我就對C++裏面的function很是感興趣,也探究出了一些成果。
這兩篇文章是對VS2010中如何實現function和bind的代碼追查,最終得出了一個function繼承體系結構圖。
這篇文章以上面得出的結構圖爲指導,最終破解了function的真實繼承體系(精簡版本)。可是卻也留下了一個問題沒有解決——我最終給出的是一個二元參數的版本,並無如實際的function那般使用起來駕輕就熟。
我決定繼續向這個問題宣戰!——
最後我勝利了。今天我就是帶着這份勝利的喜悅和你們分享到底這個function是怎麼實現的。此次不是原模原樣的解釋function的實現代碼,而是從新制做了一份精簡版的function。
————————————————————————————————————————————
function的實現原理和  [C/C++再探討STL裏的function和bind的實現  中講的同樣,具體的你們能夠回去溫故一下。我只講之前沒有講過的。

上面這篇文章中提到了怎麼去使用宏來擴充模板參數,可是僅限於模仿,並無理解其中的要義。我一點一點的順序介紹吧。

function基類的模板參數應該是<class _TResult, class _T0, ... class _T2>、<class _TResult, class _T0, ... class _T9>這種樣式的,這是毫無疑問的。這樣才能組成_ResultType(_T0, _T1, _T2)、_ResultType(_T0, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9)這樣的函數指針。上面的參數形式針對的是普通形式的函數指針,對於類的成員函數指針咱們須要<class _TResult, class _ClassType, class _T0, ... class _T2>、<class _TResult, class _ClassType, class _T0, ... class _T9>這樣的參數列表以構成_ResultType(_ClassType::*)(_T0, _T1, _T2)、_ResultType(_ClassType::*)(_T0, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9)這樣的類成員函數指針。

宏——絕對是C/C++世界裏面最奇妙的東西之一,經過宏你可以實現出大量的重複代碼。而根據我在[C/C++再探討STL裏的function和bind的實現  裏面講到的 FunctionBase、FunctionOfMem、 FunctionOfPtr 、 Functor 在實現一元到十元的模板類的過程當中,除卻參數個數的不一樣,基本的代碼結構沒有任何變化。既然如此,我先想辦法如何生成FunctionBase0 ... FunctionBase十、 FunctionOfMem0  ...  FunctionOfMem十、  FunctionOfPtr0  ...  FunctionOfPtr十、  Functor0 ...  Functor10這些模板類。而既然這些模板類僅僅是差在參數個數上,我想有必要先把模板參數的各個單元分解出來,以下(完整板的請看代碼):
函數

// 模板參數(右側)列表 	class _T0 , class _T1 , class _T2
#define TmplArgList3	TmplArgList2 , TmplArgType(2)

// 模板參數(完整)列表 	class _ResultType , class _T0 , class _T1 , class _T2
#define TemplList3	TemplList2 , TmplArgType(2)

// 函數參數		_T2 arg2
#define TmplArgT3	TmplArg(2) TmplArgV(2)

// 函數參數列表		_T0 arg0 , _T1 arg1 , _T2 arg2
#define TmplArgTList3	TmplArgTList2 , TmplArgT3

// 模板參數變量		_T2
#define TmplArgOT3	TmplArg(2)

// 模板參數變量列表	_T0 , _T1 , _T2
#define TmplArgOTList3	TmplArgOTList2 , TmplArgOT3

// 函數參數變量		arg2
#define TmplArgOV3	TmplArgV(2)

// 函數參數變量列表	arg0 , arg1 , arg2
#define TmplArgOVList3	TmplArgOVList2 , TmplArgOV3

// 函數指針		_ResultType(_T0, _T1, _T2)
#define TmplFuncPtr3	TmplResult(TmplArgOTList3)





// 模板參數(右側)列表 	class _T0 , class _T1 , class _T2 , class _T3
#define TmplArgList4	TmplArgList3 , TmplArgType(3)

// 模板參數(完整)列表 	class _ResultType , class _T0 , class _T1 , class _T2 , class _T3
#define TemplList4	TemplList3 , TmplArgType(3)

// 函數參數		_T3 arg3
#define TmplArgT4	TmplArg(3) TmplArgV(3)

// 函數參數列表		_T0 arg0 , _T1 arg1 , _T2 arg2 , _T3 arg3
#define TmplArgTList4	TmplArgTList3 , TmplArgT4

// 模板參數變量		_T3
#define TmplArgOT4	TmplArg(3)

// 模板參數變量列表	_T0 , _T1 , _T2 , _T3
#define TmplArgOTList4	TmplArgOTList3 , TmplArgOT4

// 函數參數變量		arg3
#define TmplArgOV4	TmplArgV(3)

// 函數參數變量列表	arg0 , arg1 , arg2 , arg3
#define TmplArgOVList4	TmplArgOVList3 , TmplArgOV4

// 函數指針		_ResultType(_T0, _T1, _T2, _T3)
#define TmplFuncPtr4	TmplResult(TmplArgOTList4)
我在TmplArgDef0.h文件中定義了模板參數從1—10的宏。你們能夠看到其實從參數爲2開始後面的宏模樣基本同樣,爲了理解簡單我就沒有在作處理——由於既然有重複代碼,那麼確定能夠經過宏減小可見的代碼。

——————————————————————————————————————————————
寫不下去了,我先把代碼上傳上去,各位本身下載回去慢慢研究吧,又不懂的能夠發郵件給我,個人郵件地址是lvan100@yeah.net。也能夠經過QQ聯繫我,840078322。

C++中function和bind是如何實現的

相關文章
相關標籤/搜索