剖析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++發展到這一步是神奇還是夢魘。

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