簡體   English   中英

向 std::unique_ptr 添加深拷貝構造函數<my_type>

[英]Add a deep copy ctor to std::unique_ptr<my_type>

我想將一些std::unique_ptr<my_type>std::vector 由於my_type提供了clone()方法,因此制作my_type *深層副本非常簡單。 關鍵是如何在添加復制構造函數和賦值運算符的同時擴展std::unique_ptr保留其所有功能。 遺產? 模板專業? 你能提供一個代碼片段嗎?

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++ 中的克隆方法。

這看起來是一種方法:

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 在處理副本和向量時不會報告任何內存泄漏。

在我看來, boost::ptr_container 似乎可以滿足您的需求。 http://www.boost.org/doc/libs/1_55_0/libs/ptr_container/doc/ptr_container.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM