Question

I would like to store some std::unique_ptr<my_type> into a std::vector. Since my_type provides a clone() method it's quite straightforward to make deep copies of my_type *. The point is how to extend std::unique_ptr preserving all its functionalities while adding the copy ctor and the assignment operator. Inheritance? Templace specialization? Could you please provide a code snippet?

Was it helpful?

Solution 2

This looks like a way to go:

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; }
};

It compiles without any warning from gcc and clang, and valgrind doesn't report any memory leak while playing around with copies and vectors.

OTHER TIPS

The purpose of std::unique_ptr is for it to be unique i.e. it shouldn't be copyable. That's why they made it to be move-only. It is used for representing unique ownership.

If you want to make a deep copy then let your copy constructor do its work, that's what it's for.

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.

The purpose of the copy ctor is to make a deep copy. You don't need a clone method in C++.

It sounds to me as if boost::ptr_container would serve your needs here. http://www.boost.org/doc/libs/1_55_0/libs/ptr_container/doc/ptr_container.html

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top