shared_dynamic_cast和dynamic_pointer_cast之间的区别

Nic*_*ick 19 c++ boost c++11

有人可以向我解释一下之间的区别:

shared_dynamic_castdynamic_pointer_cast从Boost库?

在我看来,它们可能是等同的.

GMa*_*ckG 27

给定a shared_ptr<T>,这两个函数确实是等价的.

不同之处在于,shared_dynamic_cast 它只适用于shared_ptr<>'s,同时dynamic_pointer_cast适用于任何类型的指针(通过重载).这使您可以对任何指针概念执行动态转换,无论指针实际组成的方式如何:

#include <boost/pointer_cast.hpp>
#include <boost/shared_ptr.hpp>

struct foo {};
struct bar : foo { void f(){} };

template <typename Ptr>
void test(Ptr ptr)
{
    boost::dynamic_pointer_cast<bar>(ptr)->f();
}

int main()
{
    bar b;
    foo* pf = &b;

    std::shared_ptr<foo> spf(new bar());

    test(pf); // turns into dynamic_cast<bar*>(pf)->f();
    test(spf); // turns into shared_dynamic_cast<bar>(pf)->f();
}
Run Code Online (Sandbox Code Playgroud)

由于dynamic_pointer_cast具有更多的能力shared_dynamic_cast,后一种功能已被弃用.(同样在C++ 11中,只存在dynamic_pointer_cast.)

(当然,其他演员变体的想法也是一样的.)