C++ 带boost::shared\u ptr的静态\u cast?

C++ 带boost::shared\u ptr的静态\u cast?,c++,boost,shared-ptr,static-cast,C++,Boost,Shared Ptr,Static Cast,与boost::shared\u ptr相当的static\u cast是什么 boost::shared_ptr<Base> b(new Derived()); boost::shared_ptr<Derived> d = ??? 换句话说,我必须如何重写以下内容 Base* b = new Derived(); Derived* d = static_cast<Derived*>(b); 使用boost::static\u pointer\u cast

boost::shared\u ptr
相当的
static\u cast
是什么

boost::shared_ptr<Base> b(new Derived());
boost::shared_ptr<Derived> d = ???
换句话说,我必须如何重写以下内容

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

使用
boost::static\u pointer\u cast

boost::shared_ptr<Base> b(new Derived());
boost::shared_ptr<Derived> d = boost::static_pointer_cast<Derived>(b);
boost::shared_ptr b(新派生的());
boost::shared_ptr d=boost::static_pointer_cast(b);

智能指针有三个强制转换运算符:
静态指针强制转换
动态指针强制转换
,和
常量指针强制转换
。它们位于命名空间
boost
(由
提供)或命名空间
std::tr1
(由boost或编译器的tr1实现提供)。

作为注释:如果派生实际上是从基派生的,那么应该使用动态指针转换而不是静态转换。系统将有机会检测何时/是否您的强制转换不正确。

值得一提的是,Boost和TR1实现提供的强制转换操作符的数量存在差异


TR1没有定义第三个运算符const_pointer_cast()

我一开始尝试了对原始指针进行强制转换和重新强制转换,但不知道静态指针_cast。因此,我认为有关于stackoverflow的这些信息是有用的。
boost::static\u pointer\u cast(b)
也可以用作
Base
是隐式的。我只是想告诉大家,如果您使用它,并且派生类还没有被完全包含(即,它只是被正向声明),您会得到非常没有帮助的“无效类型转换”:从“基*”到“派生*”。我花了很长时间盯着屏幕才发现:)是‘boost::shared_ptr d=boost::static_pointer_cast(b);’有效吗?因为b只包含基类的内存-'b(new base());'@Oleksandra,是的-但这和OP中的错误是一样的。编辑Frank的帖子就是这样。如果Base没有虚拟成员,系统无法检测到这一点。Dynamic_cast仅在拥有虚拟成员的类上具有魔力。此外,还有性能上的冲击。如果您确实知道强制转换应该总是成功的,那么静态强制转换将在没有运行时开销的情况下工作……通常没有运行时开销。我记不起细节,但对于虚拟多重继承或其他一些特殊情况,在技术上会有开销,但仍然小于动态_cast。如果派生类位于另一个库中,则动态_cast可能不起作用,而不是基类。它不应该是
Base*b=new-Derived()?根据,
const\u pointer\u cast
在C++11中可用。