剖析C++11中STL库thread类的一小段代码(MS版本)

//剖析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++发展到这一步是神奇还是梦魇。

*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章