Static_cast с boost:: shared_ptr?

Что эквивалентно static_cast с boost::shared_ptr?

Другими словами, как мне переписать следующий

Base* b = new Derived();
Derived* d = static_cast<Derived*>(b);

при использовании shared_ptr?

boost::shared_ptr<Base> b(new Derived());
boost::shared_ptr<Derived> d = ???

Ответ 1

Используйте boost::static_pointer_cast:

boost::shared_ptr<Base> b(new Derived());
boost::shared_ptr<Derived> d = boost::static_pointer_cast<Derived>(b);

Ответ 2

Для интеллектуальных указателей существует три оператора трансляции: static_pointer_cast, dynamic_pointer_cast и const_pointer_cast. Они находятся либо в пространстве имен boost (предоставляется <boost/shared_ptr.hpp>), либо в пространстве имен std::tr1 (предоставляется либо Boost, либо реализацией вашего компилятора TR1).

Ответ 3

В качестве комментария: если Derived действительно выводит из Base, то вы должны использовать dynamic_pointer_cast, а не статические приведения. Система будет иметь возможность обнаруживать, когда/если ваш приведение неверно.

Ответ 4

Стоит упомянуть, что существует разница в количестве операторов литья, предоставляемых Boost и реализациях TR1.

TR1 не определяет третий оператор const_pointer_cast()