将深拷贝ctor添加到std :: unique_ptr <my_type> </my_type>

时间:2014-05-08 07:45:05

标签: c++ c++11 copy-constructor deep-copy unique-ptr

我想将一些std::unique_ptr<my_type>存储到std::vector中。由于my_type提供了clone()方法,因此制作my_type *的深层副本非常简单。关键是如何在添加复制ctor和赋值运算符时扩展std::unique_ptr保留其所有功能。遗产? Templace专业化?你能提供一个代码片段吗?

3 个答案:

答案 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