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

*/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Content Containers...................................................................................................................1 Item 1. Choose your containers with care...........................................................1 Item 2. Beware the illusion of container-independent code................................4 Item 3. Make copying cheap and correct for objects in containers.....................9 Item 4. Call empty instead of checking size() against zero..............................11 Item 5. Prefer range member functions to their single-element counterparts...12 Item 6. Be alert for C++'s most vexing parse...................................................20 Item 7. When using containers of newed pointers, remember to delete the pointers before the container is destroyed............................................................22 Item 8. Never create containers of auto_ptrs....................................................27 Item 9. Choose carefully among erasing options..............................................29 Item 10. Be aware of allocator conventions and restrictions..........................34 Item 11. Understand the legitimate uses of custom allocators........................40 Item 12. Have realistic expectations about the thread safety of STL containers. 43 容器 条款1: 仔细选择你要的容器 条款2: 小心对“容器无关代码”的幻想 条款3: 使容器里对象的拷贝操作轻量而正确 条款4: 用empty来代替检查size是否为0 条款5: 尽量使用范围成员函数代替他们的单元素兄弟 条款6: 警惕C++的及其令人恼怒的分析 条款7: 当使用new得指针的容器时,切记在容器销毁前delete那些指针 条款8: 千万不要把auto_ptr放入容器 条款9: 小心选择删除选项 条款10: 当心allocator的协定和约束 条款11: 了解自定义allocator的正统使用法 条款12: 对STL容器的线程安全性的期待现实一些

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值