gpt4 book ai didi

c++ - 自动克隆 unique_ptr

转载 作者:IT老高 更新时间:2023-10-28 21:34:05 26 4
gpt4 key购买 nike

std::unique_ptr 有一个已删除的复制构造函数,这意味着如果你的类 Foo 中有一个 unique_ptr 作为数据成员那么您必须为 Foo 编写自己的复制构造函数并手动深度复制该成员(即使编译器生成的复制构造函数对所有其他成员都可以)。

为了能够以多态方式进行复制,可以使用 clone() 方法模式。假设我们的对象有一个这样的克隆方法:

class Base {
virtual std::unique_ptr<Base> clone() = 0;
};

Foo 现在看起来像这样:

class Foo {
public:
...
Foo(Foo const& other)
: b(other.b->clone())
, // init 10 more members that could otherwise be auto-copied just fine
// with the automatically generated copy constructor
{}
...

private:
std::unique_ptr<Base> b;
//10 more data members

};

现在,我找到了一种自动克隆 Foo::b 的方法,方法是在 unique_ptr 上编写一个包装器,该包装器通过调用 定义复制构造函数和赋值克隆.

template <typename T>
class auto_cloned_unique_ptr
{
private:
std::unique_ptr<T> up;

public:
// copy constructor
auto_cloned_unique_ptr(auto_cloned_unique_ptr<T> const& other)
: up(other.up->clone()) {}

// copy assignment
auto_cloned_unique_ptr<T>& operator =(auto_cloned_unique_ptr<T> const& other)
{
this->up = other.up->clone();
return *this;
}

auto_cloned_unique_ptr(std::unique_ptr<T> _up)
: up(std::move(_up)) {}

// Delegate everything else to unique_ptr
auto_cloned_unique_ptr(auto_cloned_unique_ptr<T>&& other)
: up(std::move(other.up)) {}

auto_cloned_unique_ptr<T>& operator =(auto_cloned_unique_ptr<T>&& other)
{
this->up = std::move(other.up);
return *this;
}

auto operator *() const {return *up;}
auto operator->() const {return up.operator->();}
auto get() -> const {return up.get();}

};

现在如果我们使用它,我们就不需要定义自己的复制构造函数了:

class Foo2 {
public:
...

private:
auto_cloned_unique_ptr<Base> b;
//10 more data members

};

这种方法是否非常不受欢迎(因为在 unique_ptr 上使用非标准包装器)?

最佳答案

让我先解释一下你想要做什么:你想要 Foo 的每个实例有自己的 Base 实例在 b ;特别是,如果您复制 Foo ,拷贝将有自己的新 Base ,最初具有相同的“值”。换句话说,Base应该表现得像一个

同时不能存储Base直接在 Foo因为它是一个抽象类。换句话说,你想要 b成为 polymorphic .

你有它:你想要一个多态值。其他人已经认识到这种需求,并建议将 C++20 设置为 polymorphic_value<Base> .来自文档:

The class template, polymorphic_value, confers value-like semantics on a free-store allocated object. A polymorphic_value may hold an object of a class publicly derived from T, and copying the polymorphic_value will copy the object of the derived type.

它有一个您现在可以使用的引用实现。非常简单地说,它是 std::unique_ptr 的包装。与您的建议类似。

关于c++ - 自动克隆 unique_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23726228/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com