首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

* STL 原代码里边的一段看不董鸟(VS2012 版本) *

2013-08-14 
***** STL 原代码里面的一段看不董鸟(VS2012 版本) ************std::function 里面的申明如下templatecl

***** 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; 
};
...


就是抓取函数 signature 用的,这样可以通过特化,实例化不同的 _Func_class,执行功能。
[解决办法]
研究这些价值不大,库的复杂度交给牛逼委员会把。
[解决办法]
是啊,你怎么不去看看gcc源码啊?
[解决办法]
可以看,找个支持varidic template 的编译器看对应的源码
[解决办法]
展开错了
加上 /P参数宏展开之后的代码
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 _V0_t> struct _Get_function_impl

总算看明白你问什么了。
template<class _Tx> struct _Get_function_impl; 的意思是说 _Get_function_impl 实例化的时候只能有一个模板实参。
template<class _Ret , class _V0_t> 声明新的特化可以接受数目不同的形参,但必须保证 _Get_function_impl<...> 这种特化形式的写法中 ... 只对应包含一个实参,因为这时候会检查主模板,参数个数必须一致。
[解决办法]
stl代码真难看、。。
[解决办法]
c++11新增的function和bind,之前都是boost那群人用非常牛逼的技术搞出来的东西,正常人还是不要浪费时间去研究比较好……很难看懂
更何况VS2012不支持变长模板,用的宏模拟的变长模板,更加难以看懂
[解决办法]
VS2013支持变长模板参数

代码就好看多了
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;
};

热点排行