矢量的唯一副本<unique_ptr>

Unique copy of vector<unique_ptr>

我有一个 class 对象,其中包含一个 vector<unique_ptr>。我想要这个对象的副本到 运行 非常量函数上。原件必须保持 const.

这样的 class 的复制构造函数会是什么样子?

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

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

您不能简单地复制一个 std::vector<std::unique_ptr>,因为 std::unique_ptr 不可复制,所以它会删除矢量复制构造函数。

如果您不更改存储在矢量中的类型,那么您可以通过创建一个全新的矢量来创建一个 "copy",例如

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

现在 tofrom 的单独副本,可以独立更改。


另外:如果你的类型是多态的,上面的方法将不起作用,因为你会有一个指向基class的指针。您需要做的是创建一个虚拟 clone 成员函数,并将 clone return 和 std::unique_ptr 复制到实际派生对象的副本。这将使代码看起来像:

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());

Nathan 上面的回答很好。此外,在多态情况下,我发现 this site 对定义 clone() 成员函数很有用。

我用过

std::unique_ptr<Base> Base::clone()
{
  return std::make_unique<Derived>(*this);
}

这与 Nathan 后来的评论相似。