***** STL 原代码里面的一段看不董鸟(VS2012 版本) ************
std::function 里面的申明如下
template<class _Fty>
class function
: public _Get_function_impl<_Fty>::type
{....
};
里面使用了类 _Get_function_impl,但是类定义的时候只有一个参数,下面的宏定义,模版偏特化(专门化)_Get_function_impl 的时候,回多出很多参数。也就是有可能是这样的。
template<class _Tx> struct _Get_function_impl;
展开宏定义,有可能出现类似下面的定义
template<class _Tx,class _v0_t> struct _Get_function_impl<_Tx,_v0_t>
{
typedef _Func_class<_Ret,v0_t> type;
};
template<class _Tx,class _v0_t,class _v1_t> struct _Get_function_impl<_Tx,_v0_t,v1_t>
{
typedef _Func_class<_Tx,_v0_t,_v1_t> type;
};
这样,和第一个定义,只有一个模版参数 _Tx 的不符,这个是什么原因???
// TEMPLATE CLASS _Get_function_impl
template<class _Tx>
struct _Get_function_impl;
#define _CLASS_GET_FUNCTION_IMPL( \
TEMPLATE_LIST, PADDING_LIST, LIST, COMMA, CALL_OPT, X2, X3, X4) \
template<class _Ret COMMA LIST(_CLASS_TYPE)> \
struct _Get_function_impl<_Ret CALL_OPT (LIST(_TYPE))> \
{/* determine type from argument list */ \
typedef _Func_class<_Ret COMMA LIST(_TYPE)> type; \
};
#define _CLASS_GET_FUNCTION_IMPL_CALLS( \
TEMPLATE_LIST, PADDING_LIST, LIST, COMMA, CALL_OPT, X2, X3, X4) \
_VARIADIC_CALL_OPT_X1(_CLASS_GET_FUNCTION_IMPL, \
TEMPLATE_LIST, PADDING_LIST, LIST, COMMA, __cdecl, X2, X3, X4)
_VARIADIC_EXPAND_0X(_CLASS_GET_FUNCTION_IMPL_CALLS, , , , )
[解决办法]
我觉得你宏展开错误了,应该是这样
template<class _Tx,class _v0_t>
struct _Get_function_impl<_Tx(_v0_t)> // function type
{
typedef _Func_class<_Tx,v0_t> type;
};
template<class _Tx,class _v0_t,class _v1_t>
struct _Get_function_impl<_Tx(_v0_t,v1_t)> // function type
{
typedef _Func_class<_Tx,_v0_t,_v1_t> type;
};
...
template<class _Tx>
struct _Get_function_impl;
template<class _Ret > struct _Get_function_impl<_Ret __cdecl ()>
{
typedef _Func_class<_Ret > type;
};
template<class _Ret > struct _Get_function_impl<_Ret __stdcall ()>
{
typedef _Func_class<_Ret > type;
};
template<class _Ret > struct _Get_function_impl<_Ret __fastcall ()>
{
typedef _Func_class<_Ret > type;
};
template<class _Ret , class _V0_t> struct _Get_function_impl<_Ret __cdecl ( _V0_t )>
{
typedef _Func_class<_Ret , _V0_t> type;
};
template<class _Ret , class _V0_t> struct _Get_function_impl<_Ret __stdcall ( _V0_t )>
{
typedef _Func_class<_Ret , _V0_t> type;
};
template<class _Ret , class _V0_t> struct _Get_function_impl<_Ret __fastcall ( _V0_t )>
{
typedef _Func_class<_Ret , _V0_t> type;
};
template<class _Ret , class _V0_t , class _V1_t> struct _Get_function_impl<_Ret __cdecl ( _V0_t , _V1_t )>
{
typedef _Func_class<_Ret , _V0_t , _V1_t> type;
};
template<class _Ret , class _V0_t , class _V1_t> struct _Get_function_impl<_Ret __stdcall ( _V0_t , _V1_t )>
{
typedef _Func_class<_Ret , _V0_t , _V1_t> type;
};
template<class _Ret , class _V0_t , class _V1_t> struct _Get_function_impl<_Ret __fastcall ( _V0_t , _V1_t )>
{
typedef _Func_class<_Ret , _V0_t , _V1_t> type;
};
template<class _Ret , class _V0_t , class _V1_t , class _V2_t> struct _Get_function_impl<_Ret __cdecl ( _V0_t , _V1_t , _V2_t )>
{
typedef _Func_class<_Ret , _V0_t , _V1_t , _V2_t> type;
};
template<class _Ret , class _V0_t , class _V1_t , class _V2_t> struct _Get_function_impl<_Ret __stdcall ( _V0_t , _V1_t , _V2_t )>
{
typedef _Func_class<_Ret , _V0_t , _V1_t , _V2_t> type;
};
template<class _Ret , class _V0_t , class _V1_t , class _V2_t> struct _Get_function_impl<_Ret __fastcall ( _V0_t , _V1_t , _V2_t )>
{
typedef _Func_class<_Ret , _V0_t , _V1_t , _V2_t> type;
};
template<class _Ret , class _V0_t , class _V1_t , class _V2_t , class _V3_t> struct _Get_function_impl<_Ret __cdecl ( _V0_t , _V1_t , _V2_t , _V3_t )>
{
typedef _Func_class<_Ret , _V0_t , _V1_t , _V2_t , _V3_t> type;
};
template<class _Ret , class _V0_t , class _V1_t , class _V2_t , class _V3_t> struct _Get_function_impl<_Ret __stdcall ( _V0_t , _V1_t , _V2_t , _V3_t )>
{
typedef _Func_class<_Ret , _V0_t , _V1_t , _V2_t , _V3_t> type;
};
template<class _Ret , class _V0_t , class _V1_t , class _V2_t , class _V3_t> struct _Get_function_impl<_Ret __fastcall ( _V0_t , _V1_t , _V2_t , _V3_t )>
{
typedef _Func_class<_Ret , _V0_t , _V1_t , _V2_t , _V3_t> type;
};
template<class _Ret , class _V0_t , class _V1_t , class _V2_t , class _V3_t , class _V4_t> struct _Get_function_impl<_Ret __cdecl ( _V0_t , _V1_t , _V2_t , _V3_t , _V4_t )>
{
typedef _Func_class<_Ret , _V0_t , _V1_t , _V2_t , _V3_t , _V4_t> type;
};
template<class _Ret , class _V0_t , class _V1_t , class _V2_t , class _V3_t , class _V4_t> struct _Get_function_impl<_Ret __stdcall ( _V0_t , _V1_t , _V2_t , _V3_t , _V4_t )>
{
typedef _Func_class<_Ret , _V0_t , _V1_t , _V2_t , _V3_t , _V4_t> type;
};
template<class _Ret , class _V0_t , class _V1_t , class _V2_t , class _V3_t , class _V4_t> struct _Get_function_impl<_Ret __fastcall ( _V0_t , _V1_t , _V2_t , _V3_t , _V4_t )>
{
typedef _Func_class<_Ret , _V0_t , _V1_t , _V2_t , _V3_t , _V4_t> type;
};
template<class _Tx>
struct _Get_function_impl;
template<class _Ret, class... _Types> struct _Get_function_impl<_Ret __cdecl ( _Types... )>
{
typedef _Func_class<_Ret, _Types...> type;
};
template<class _Ret, class... _Types> struct _Get_function_impl<_Ret __stdcall ( _Types... )>
{
typedef _Func_class<_Ret, _Types...> type;
};
template<class _Ret, class... _Types> struct _Get_function_impl<_Ret __fastcall ( _Types... )>
{
typedef _Func_class<_Ret, _Types...> type;
};