【问题标题】:static_cast with boost::shared_ptr?带有 boost::shared_ptr 的 static_cast?
【发布时间】:2010-10-12 02:39:23
【问题描述】:

static_castboost::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 = ???

【问题讨论】:

  • 不应该是Base *b = new Derived();吗?

标签: c++ boost shared-ptr static-cast


【解决方案1】:

使用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 上有这些信息很有用。
  • boost::static_pointer_cast&lt;Derived&gt;(b) 也可以用作 Base 是隐含的。
  • 我只是想分享一下,如果你正在使用它并且 Derived 类没有被完全包含(即它只是被前向声明)你会得到非常无用的“无效类型转换:”基 *" 到 "派生 *""。我花了很长时间盯着屏幕才弄明白:)
  • 是'boost::shared_ptr d = boost::static_pointer_cast(b);'有效的?因为 b 仅包含基类的内存 - 'b(new Base());'
  • @Oleksandra,是的 - 但这与 OP 中的错误相同。为此编辑了弗兰克的帖子。
【解决方案2】:

智能指针共有三种类型转换运算符:static_pointer_castdynamic_pointer_castconst_pointer_cast。它们位于命名空间 boost(由 &lt;boost/shared_ptr.hpp&gt; 提供)或命名空间 std::tr1(由 Boost 或编译器的 TR1 实现提供)。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 如果 Base 没有虚拟成员,则系统无法检测到这一点。 Dynamic_cast 仅对具有虚拟成员的类具有魔力。
    • 还有性能影响。如果您真的知道强制转换应该总是成功,那么 static_cast 将在没有运行时开销的情况下工作。
    • ...没有运行时开销通常。我不记得细节了,但使用虚拟多重继承或其他一些极端情况在技术上存在开销,但仍低于 dynamic_cast。
    • 如果派生类位于另一个库然后是基类,则 dynamic_cast 可能不起作用。
    【解决方案4】:

    值得一提的是,Boost 提供的强制转换运算符的数量与 TR1 的实现存在差异。

    TR1没有定义第三个操作符const_pointer_cast()

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多