Разница между shared_dynamic_cast и dynamic_pointer_cast - PullRequest
19 голосов
/ 22 февраля 2012

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

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

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

1 Ответ

27 голосов
/ 22 февраля 2012

Учитывая shared_ptr<T>, две функции действительно эквивалентны.

Разница в том, что shared_dynamic_cast только работает с shared_ptr<>, а dynamic_pointer_cast работает слюбой вид указателя (через перегрузку).Это позволяет выполнять динамическое приведение к любому указателю concept , независимо от того, как этот указатель фактически составлен:

#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.)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...