向下转换std :: shared_ptr的有效方法

时间:2017-09-14 10:25:10

标签: c++11

有没有办法在不使用std :: dynamic_pointer_cast完成新的shared_ptr和移动的情况下对std :: shared_ptr进行强制转换?

还有一个场景我不打算拥有shared_ptr,在这种情况下我想创建对现有shared_ptr的引用

e.g。

const std::shared_ptr<derived>& d = std::dynamic_pointer_cast<derived>(b); // 
where b is std::shared_ptr<base>

这里我得到b的引用,但仍然支付临时shared_ptr。

除了在这里使用原始指针之外还有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

您可以从shared_ptr获取指针或引用并向下转发:

std::shared_ptr<Base> b(new Derived);
auto& d1 = dynamic_cast<Derived&>(*b);
auto* d2 = dynamic_cast<Derived*>(&*b);
auto* d3 = dynamic_cast<Derived*>(b.get());

请注意,销毁原始shared_ptr可能会使原始指针和引用无效。