Unique copy of vector<unique_ptr>

依然范特西╮ 提交于 2019-12-06 23:47:09

问题


I have a class object which contains a vector<unique_ptr>. I want a copy of this object to run non-const functions on. The original copy must remain const.

What would the copy constructor for such a class look like?

class Foo{
public:
 Foo(const Foo& other): ??? {}

 std::vector<std::unique_ptr> ptrs;
};

回答1:


You cannot simply copy a std::vector<std::unique_ptr> because std::unique_ptr is not copyable so it will delete the vector copy constructor.

If you do not change the type stored in the vector then you could make a "copy" by creating a whole new vector like

std::vector<std::unique_ptr<some_type>> from; // this has the data to copy
std::vector<std::unique_ptr<some_type>> to;
to.reserve(from.size()) // preallocate the space we need so push_back doesn't have to

for (const auto& e : from)
    to.push_back(std::make_unique<some_type>(*e));

Now to is a separate copy of from and can be changed independently.


Additionally: If your type is polymorphic the above won't work as you would have a pointer to the base class. What you would have to do is make a virtual clone member function and have clone return a std::unique_ptr to a copy of the actual derived object. That would make the code look like:

std::vector<std::unique_ptr<some_type>> from; // this has the data to copy
std::vector<std::unique_ptr<some_type>> to;
to.reserve(from.size()) // preallocate the space we need so push_back doesn't have to

for (const auto& e : from)
    to.push_back(e->clone());


来源:https://stackoverflow.com/questions/34797849/unique-copy-of-vectorunique-ptr

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!