宏——绝对是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)