如何通过多态引用传递 unique_ptr?

How to pass unique_ptr by reference polymorphically?

我有一个纯虚拟 class Base 和一些派生的 classes ChildA(A/B/C 等):

class Base {
    ...
}

class ChildA : public Base {
    ...
}

我需要对这些子 classes 的所有权进行特定控制,因此我通过工厂函数和 std::unique_ptr.

生成它们

在 creation/setup 期间的某个时刻,我需要以所有派生的 classes 通用的方式修改它们(不是制作副本或更改所有权),所以我想要使用接受其基类型并通过引用获取的函数:

void modifyInstance(std::unique_ptr<Base>& baseInst);

但是当我尝试像这样使用这个函数时:

bool childAFactory(std::unique_ptr<ChildA>& buffer)
{
    buffer = std::make_unique<ChildA>();
    modifyInstance(buffer);
} 

我收到这个错误:

error: non-const lvalue reference to type 'unique_ptr<Base>' cannot bind to a value of unrelated type 'unique_ptr<ChildA>'

难道不能以这种特殊方式利用多态性吗?我能找到的唯一类似线程是尝试按值传递的地方,在这种情况下,您显然必须使用 std::move() 并放弃所有权。

我会让函数采用常规 Base 指针并使用 unique_ptr::get() 但我还需要能够有条件地重置函数内的指针(因此指针及其内容需要能够被修改,因此通过引用传递 unique_ptr)。

我会这样做:

bool modifyInstance(Base* baseInst);

bool childAFactory(std::unique_ptr<ChildA>& buffer)
{
    buffer = std::make_unique<ChildA>();
    if (!modifyInstance(buffer.get()))
        buffer.reset();
}

也就是说,让工厂对生命周期负责,只是return当对象需要销毁时modifyInstance()一个错误结果。