我想存储的载体std::threads
目前,我实现它作为std::vector<std::thread*>
然而,这需要手动删除std::thread
小号
什么是做到这一点的最优雅的C ++ 11的方式? 我能看到std::shared_ptr
,但是是不是矫枉过正? 该指针是唯一的,但std::vector
需要临时复制它们。
也许我并不需要指针,但std::thread
是不可拷贝,但我觉得我做的。
谢谢!
我想存储的载体std::threads
目前,我实现它作为std::vector<std::thread*>
然而,这需要手动删除std::thread
小号
什么是做到这一点的最优雅的C ++ 11的方式? 我能看到std::shared_ptr
,但是是不是矫枉过正? 该指针是唯一的,但std::vector
需要临时复制它们。
也许我并不需要指针,但std::thread
是不可拷贝,但我觉得我做的。
谢谢!
由于C ++ 11, vector
只要求其值是可移动的,如thread
是。 所以vector<thread>
应该满足您的需求。
还有你可以用不可复制的类型做一些限制 - 你不能在复制值或缩小,只有移动或布设他们 - 但这些都是很容易适应。
如果您确实需要保存不可移动的类型( mutex
,例如),那么unique_ptr
可能是最好的选择; 或类似容器deque
或list
并不需要移动自己的价值观。
同比可以使用std::vector<std::thread>
和emplace_back
:
threads.emplace_back([](int i){ ++i; }, 10);
emplace_back
使用完美转发直接传递它的参数std::thread
构造函数,并在放置新的对象vector
内存,是这样的:
new (vector_ptr + offset) std::thread(args...);
它不仅涉及运动 -处理对象是替代复制和在资源使用方面可能会更便宜一个新的语义。 std::thread
支持移动 。
使用std ::的unique_ptr如果你的编译器支持C ++ 11,或升压:: shared_ptr的,如果你的编译器不。
不,这是不是矫枉过正 - 这是良好的编程。