Вопрос

Что эквивалентно 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 ()

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top