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