Разница между shared_dynamic_cast и dynamic_pointer_cast
Может кто-нибудь объяснить мне разницу между:
shared_dynamic_cast и dynamic_pointer_cast из библиотеки Boost?
Мне кажется, что они могут быть эквивалентными.
Ответ 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.)
(Идея такая же и для других вариантов броска, конечно.)