unique_ptr 到派生的 class 作为函数的参数,该函数接受 unique_ptr 到基数 class 并取得所有权

unique_ptr to a derived class as an argument to a function that takes a unique_ptr to a base class and take owenership

我已经在堆栈溢出上阅读了与此问题类似的各种评论,但没有找到我的问题的确切解决方案。 我有一个 Base class 和 Derived class 还有一个 class 包含并保留此对象的所有权。

class Base { };
class Derived: public Base { };

class MyClass
{
  std::vector<std::unique_ptr<Base>> myVector;
public:
  MyClass() {}

  void addElement (std::unique_ptr<Base> &base)
  {
    myVector.push_back(std::move(base));
  }
};

当我尝试在 class 中添加派生对象时,我的代码无法编译。

MyClass myClass;

auto b = std::make_unique<Base>();
myClass.addElement(b);

auto d = std::make_unique<Derived>();
myClass.addElement (d); // <-- ERROR: error: cannot convert ‘std::unique_ptr >’ to ‘std::unique_ptr&’

该函数必须按值接受 unique_ptr

  void addElement (std::unique_ptr<Base> base)
  {
    myVector.push_back(std::move(base));
  }

然后像这样调用成员函数:

MyClass myClass;

auto b = std::make_unique<Base>();
myClass.addElement(std::move(b));

auto d = std::make_unique<Derived>();
myClass.addElement(std::move(d));

或者更好地避免使用变量,因为在函数调用之后无论如何都不能使用它们:

MyClass myClass;

myClass.addElement(std::make_unique<Base>());

myClass.addElement(std::make_unique<Derived>());