Ответ 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
.)
(Идея такая же и для других вариантов броска, конечно.)