//剖析C++11中STL库thread类的一小段代码(MS版本)
/*
写一段代码,使用thread构造函数的时候,提示有9个构造函数,但明明白白写的有3个,
但有一段奇怪的宏,也就是下面代码展开后,实现了6个构造函数
*/
#define _THREAD_CONS( \
TEMPLATE_LIST, PADDING_LIST, LIST, COMMA, X1, X2, X3, X4) \
template<class _Fn COMMA LIST(_CLASS_TYPE)> \
explicit thread(_Fn _Fx COMMA LIST(_TYPE_REFREF_ARG)) \
{ /* construct with _Fx(_Ax...) */ \
_Launch(&_Thr, \
_STD bind(_Decay_copy(_STD forward<_Fn>(_Fx)) \
COMMA LIST(_FORWARD_ARG))); \
}
_VARIADIC_EXPAND_0X(_THREAD_CONS, , , , )
#undef _THREAD_CONS
/*
简单的看,就两个宏,先展开第一个,因为现在的情况,第二个确实无法展开
*/
_VARIADIC_EXPAND_0(_THREAD_CONS, , , , )
_VARIADIC_EXPAND_1(_THREAD_CONS, , , , )
_VARIADIC_EXPAND_2(_THREAD_CONS, , , , )
_VARIADIC_EXPAND_3(_THREAD_CONS, , , , )
_VARIADIC_EXPAND_4(_THREAD_CONS, , , , )
_VARIADIC_EXPAND_5(_THREAD_CONS, , , , )
/*
确实是6行,也就是每行对应一个函数,继续展开
*/
_THREAD_CONS(_TEM_LIST0, _PAD_LIST0, _RAW_LIST0, , , , , )
_THREAD_CONS(_TEM_LIST1, _PAD_LIST1, _RAW_LIST1, _COMMA, , , , )
_THREAD_CONS(_TEM_LIST2, _PAD_LIST2, _RAW_LIST2, _COMMA, , , , )
_THREAD_CONS(_TEM_LIST3, _PAD_LIST3, _RAW_LIST3, _COMMA, , , , )
_THREAD_CONS(_TEM_LIST4, _PAD_LIST4, _RAW_LIST4, _COMMA, , , , )
_THREAD_CONS(_TEM_LIST5, _PAD_LIST5, _RAW_LIST5, _COMMA, , , , )
/*
貌似第一个比较特殊,后面的都一样;先保留第一个,拿第二个开刀(忽略函数实现,好几个个参数被忽略了,逗号直接替换)
这步要慢一点,分两次
*/
template<class _Fn, _PAD_LIST1(_CLASS_TYPE)>
explicit thread(_Fn _Fx, _PAD_LIST1(_TYPE_REFREF_ARG))
{
//...
}
//展开_PAD_LIST1
template<class _Fn, _CLASS_TYPE(0), _CLASS_TYPE(1), _CLASS_TYPE(2), _CLASS_TYPE(3), _CLASS_TYPE(4)>
explicit thread(_Fn _Fx, _TYPE_REFREF_ARG(0), _TYPE_REFREF_ARG(1), _TYPE_REFREF_ARG(2), _TYPE_REFREF_ARG(3), _TYPE_REFREF_ARG(4), _TYPE_REFREF_ARG(5))
{
//...
}
/*
0-5都是一样的,只要展开_CLASS_TYPE(0) _TYPE_REFREF_ARG(0)
就是引入一个类型,引入一个此类型的变量
*/
_CLASS_TYPE(0) -> class _VAR_TYPE(NUM) -> class _V0_t
_CLASS_TYPE(4) -> class _VAR_TYPE(NUM) -> class _V4_t
_TYPE_REFREF_ARG(0) -> _VAR_TYPE(NUM)&& _VAR_VAL(NUM) -> _V0_t&& _V0
_TYPE_REFREF_ARG(4) -> _VAR_TYPE(NUM)&& _VAR_VAL(NUM) -> _V4_t&& _V0
/*
把上面的宏展开到构造函数里,实际上是线程的回调函数和参数,其他的5个类似展开,只是个数不一样
*/
template<class _Fn, class _V0_t, class _V1_t, class _V2_t, class _V3_t, class _V4_t>
explicit thread(_Fn _Fx, _V0_t&& _V0, _V1_t&& _V1, _V2_t&& _V2, _V3_t&& _V3, _V4_t&& _V4)
{
//...
}
/*
总结:
#if !defined(_VARIADIC_MAX)
#define _VARIADIC_MAX 5
默认这个变量是5,其实还可以定义到5-10之间任意一个数
有些参数没有用到,不太理解,难道别的地方用,为了统一,减少宏的个数?
宏?模板?变参?真不知道C++发展到这一步是神奇还是梦魇。
*/
剖析C++11中STL库thread类的一小段代码(MS版本)
最新推荐文章于 2024-02-23 16:50:09 发布