首页 > 解决方案 > 如何获得具有唯一指针的多态行为?

问题描述

在较长的休息后玩弄 C++。

我有一个std::vector指向我迭代的对象的唯一指针,调用一个函数,该函数将vector派生对象的基类作为参数,如下所示:

for (auto const& object : objects)
{
    _process(object);
}

在哪里objects

std::vector<std::unique_ptr<Derived>>

我想了解如何强制执行多态行为来调用该函数:

_process(std::unique_ptr<Base> base)

标签: c++c++11stlsmart-pointers

解决方案


std::unique_ptr代表所有权,因此不能复制。

这意味着这_process(std::unique_ptr<Base> base)是一个接收器,即它消耗对象(它可以销毁它或将它存储在某个地方,但调用者不再控制它)。为了调用它,您必须使用std::move

_process(std::move(object))

这样你就明确拒绝了对象的所有权,并从你的容器中删除了它——指针将被重置为nullptr.

当然,这只能通过非const参考来完成。

如果您不想转移所有权而只想对对象做一些事情(名称_process似乎暗示了这一点),您应该传递常规的原始指针:

_process(Base* base);
...
for (auto const& object : objects)
{
    _process(object.get());
}

除了控制对象的生命周期之外,原始指针仍然适用于一切。

在这两种情况下(原始指针和),从隐式转换到unique_ptr绝对没有问题。DerivedBase


推荐阅读