[英]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.