有人可以向我解释一下:

Boost库中的shared_dynamic_castdynamic_pointer_cast

在我看来,它们可能是等效的。

最佳答案

给定shared_ptr<T>,这两个函数确实等效。

不同之处在于shared_dynamic_cast仅适用于shared_ptr<>,而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();
}

由于dynamic_pointer_cast具有shared_dynamic_cast和更多的功能,因此不推荐使用后者的功能。 (与C++ 11中一样,仅存在dynamic_pointer_cast。)

(当然,其他转换类型的想法也相同。)

关于c++ - shared_dynamic_cast和dynamic_pointer_cast之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9391863/

10-11 21:06