статический бросок с повышением:: общий 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 = ???
4 71

4 ответа:

использовать 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 ()