【发布时间】:2021-10-09 13:44:08
【问题描述】:
我需要通过一些条件检查在 2 vector<unique_ptr> 之间移动元素。移动后,我将忽略from-vector(将所有权转移到to-vector)。
案例1:从vector<unique_ptr<Derived>> fromDeriveds移动到vector<unique_ptr<Base>> toBases:
vector<unique_ptr<Derived>> fromDeriveds;
vector<unique_ptr<Base>> toBases;
for (unique_ptr<Derived> &derived: fromDeriveds)
{
if (derived->prop == 1)
{
toBases.push_back(move(derived));
}
}
这个案子不错。
案例2:从vector<unique_ptr<Base>> fromBases移动到vector<unique_ptr<Derived>> toDeriveds:
vector<unique_ptr<Base>> fromBases;
vector<unique_ptr<Derived>> toDeriveds;
for (unique_ptr<Base> &base: fromBases)
{
Derived *derived = dynamic_cast<Derived *>(base.get());
if (derived && derived->prop == 1)
{
toDeriveds.push_back(move(base));
}
}
编译失败,报如下错误:
main.cpp:44:44: error: no matching function for call to ‘std::vector<std::unique_ptr<Derived> >::push_back(std::remove_reference<std::unique_ptr<Base>&>::type)’
toDeriveds.push_back(move(base));
^
虽然我可以通过以下方式做到,但它是复制而不是移动:
vector<unique_ptr<Base>> fromBases;
vector<unique_ptr<Derived>> toDeriveds;
for (unique_ptr<Base> &base: fromBases)
{
Derived *derived = dynamic_cast<Derived *>(base.get());
if (derived && derived->prop == 1)
{
toDeriveds.push_back(make_unique<Derived>(*derived));
}
}
有没有更好的方法来实现目标?
【问题讨论】:
标签: c++ vector polymorphism unique-ptr