[C/C++]完整揭秘VS2010关于function和bind的实现

2013/10/25 22:16
阅读数 1.9K
很久之前我就对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 ... FunctionBase10、 FunctionOfMem0  ...  FunctionOfMem10、  FunctionOfPtr0  ...  FunctionOfPtr10、  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是如何实现的

展开阅读全文
打赏
0
16 收藏
分享
加载中
更多评论
打赏
0 评论
16 收藏
0
分享
返回顶部
顶部