我想将一些std::unique_ptr<my_type>
存储到std::vector
中。由于my_type
提供了clone()
方法,因此制作my_type *
的深层副本非常简单。关键是如何在添加复制ctor和赋值运算符时扩展std::unique_ptr
保留其所有功能。遗产? Templace专业化?你能提供一个代码片段吗?
答案 0 :(得分:7)
std::unique_ptr
的目的是让它独一无二,即它不应该是可复制的。这就是为什么他们让它成为仅限移动的原因。它用于表示独特的所有权。
如果你想制作一份深层副本,那就让你的复制构造函数完成它的工作吧。
std::unique_ptr<my_type> ptr1{new my_type{}}; // Lets say you have this.
std::unique_ptr<my_type> ptr2{new my_type{*ptr1}}; // Make deep copy using copy ctor.
复制文件的目的是制作一份深层复制品。你不需要在C ++中使用克隆方法。
答案 1 :(得分:4)
这看起来像是一种方式:
struct my_type_ptr: public std::unique_ptr<my_type,std::default_delete<my_type>>{
using unique_ptr::unique_ptr; //inheriting constructors
//adding copy ctor and assigment operator
my_type_ptr(const my_type_ptr & o):
unique_ptr<my_type,std::default_delete<my_type>>()
{ reset( o ? o->clone() : nullptr); }
my_type_ptr& operator=(const my_type_ptr & o)
{ reset( o ? o->clone() : nullptr); return *this; }
};
它在没有gcc和clang的任何警告的情况下进行编译,并且valgrind在使用副本和向量时不会报告任何内存泄漏。
答案 2 :(得分:1)
听起来好像boost :: ptr_container可以满足您的需求。 http://www.boost.org/doc/libs/1_55_0/libs/ptr_container/doc/ptr_container.html