Ответ 1
Используйте boost::static_pointer_cast
:
boost::shared_ptr<Base> b(new Derived());
boost::shared_ptr<Derived> d = boost::static_pointer_cast<Derived>(b);
Что эквивалентно 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 = ???
Используйте boost::static_pointer_cast
:
boost::shared_ptr<Base> b(new Derived());
boost::shared_ptr<Derived> d = boost::static_pointer_cast<Derived>(b);
Для интеллектуальных указателей существует три оператора трансляции: static_pointer_cast
, dynamic_pointer_cast
и const_pointer_cast
. Они находятся либо в пространстве имен boost
(предоставляется <boost/shared_ptr.hpp>
), либо в пространстве имен std::tr1
(предоставляется либо Boost, либо реализацией вашего компилятора TR1).
В качестве комментария: если Derived действительно выводит из Base, то вы должны использовать dynamic_pointer_cast, а не статические приведения. Система будет иметь возможность обнаруживать, когда/если ваш приведение неверно.
Стоит упомянуть, что существует разница в количестве операторов литья, предоставляемых Boost и реализациях TR1.
TR1 не определяет третий оператор const_pointer_cast()