Подтвердить что ты не робот

Разница между shared_dynamic_cast и dynamic_pointer_cast

Может кто-нибудь объяснить мне разницу между:

shared_dynamic_cast и dynamic_pointer_cast из библиотеки Boost?

Мне кажется, что они могут быть эквивалентными.

4b9b3361

Ответ 1

Учитывая 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 и больше, , последняя функция устарела. (Аналогично в С++ 11 существует только dynamic_pointer_cast.)

(Идея такая же и для других вариантов броска, конечно.)