使用boost :: shared_ptr进行static_cast?


73

static_cast与with等效boost::shared_ptr吗?

换句话说,我该如何重写以下内容

Base* b = new Derived();
Derived* d = static_cast<Derived*>(b);

什么时候使用shared_ptr

boost::shared_ptr<Base> b(new Derived());
boost::shared_ptr<Derived> d = ???

22
不是Base *b = new Derived();吗?
legends2k 2011年

Answers:


106

用途boost::static_pointer_cast

boost::shared_ptr<Base> b(new Derived());
boost::shared_ptr<Derived> d = boost::static_pointer_cast<Derived>(b);

我一开始尝试投射和重新包装原始指针,却不知道static_pointer_cast。因此,我认为在stackoverflow上获取此信息很有用。
弗兰克

4
boost::static_pointer_cast<Derived>(b)也可以作为Base隐式使用。
dalle 2010年

5
我只是想与您分享,如果您正在使用它并且尚未完全包含Derived类(即仅被向前声明),则会得到非常无用的“无效类型转换:从“ Base *”到“ Derived *” ”。我花了很长时间盯着屏幕看才知道:)
Jamie Cook 2010年

1
是'boost :: shared_ptr <Derived> d = boost :: static_pointer_cast <Derived>(b);' 有效?因为b仅包含基类的内存-'b(new Base());'
萨斯基亚2014年

@Oleksandra,是的-但这与OP中的错误相同。为此编辑了弗兰克的帖子。
peterchen 2014年

22

有三种类型转换操作符的智能指针:static_pointer_castdynamic_pointer_cast,和const_pointer_cast。它们位于命名空间boost(由提供<boost/shared_ptr.hpp>)或命名空间std::tr1(由Boost或编译器的TR1实现提供)中。


3

作为评论:如果Derived实际上是从Base派生的,那么您应该使用dynamic_pointer_cast而不是静态强制转换。系统将有机会检测您的投放时间是否正确。


如果Base没有虚拟成员,则系统将无法检测到该错误。Dynamic_cast仅在具有虚拟成员的类上具有魔力。
亚伦2009年

也有性能上的打击。如果您真的知道强制转换应始终成功,那么static_cast将在没有运行时开销的情况下运行。
Joseph Garvin

...通常没有运行时开销。我不记得详细信息,但是在虚拟多重继承或其他一些极端情况下,从技术上讲开销很大,但仍然少于dynamic_cast。
Joseph Garvin

如果Derived类位于Base类之后的另一个库中,则dynamic_cast可能无法正常工作。
安德烈·比卡

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.