Привет, Олл!
Пробую boost и возник вопрос: как сделать (если это возможно вообще) downcast для обькта по его ссылке (boost::shared_ptr)?
class CBase {...}
class CDerived : public CBase {...}
boost::shared_ptr<CBase> pBase(...);
Извлекаю обьект, производный от базового, различными способами:
CDerived* pDerived = dynamic_cast<CDerived*> (pBase);
Error 1 error C2682: cannot use 'dynamic_cast' to convert from 'boost::shared_ptr<T>' to 'CDerived *'<...>
boost::shared_ptr<CDerived> pDerived =
boost::polymorphic_cast<boost::shared_ptr<CDerived> > (pBase);
Error 1 error C2784: 'Target boost::polymorphic_cast(Source *)' : could not deduce template argument for 'Source *' from 'boost::shared_ptr<T>' <...> 383
boost::shared_ptr<CDerived> pDerived =
boost::any_cast<boost::shared_ptr<CDerived> > (pBase);
Так нет ошибок компиляции, но как ведет себя счетчик reference внутри pBase? Правильно ли это вообще?
Здравствуйте, Аноним, Вы писали:
А>Привет, Олл!
А>Пробую boost и возник вопрос: как сделать (если это возможно вообще) downcast для обькта по его ссылке (boost::shared_ptr)?
См. на dynamic_pointer_cast
http://www.boost.org/libs/smart_ptr/shared_ptr.htm#dynamic_pointer_cast
P.S. ссылка и указатель — это немного разные вещи.
boost::shared_ptr — это умный указатель, а не ссылка.
Здравствуйте, Аноним, Вы писали:
А>Привет, Олл!
А>Пробую boost и возник вопрос: как сделать (если это возможно вообще) downcast для обькта по его ссылке (boost::shared_ptr)?
Как Вы бы поступили в этом случае, если бы не пользовались умными указателями?
Думаю применили бы static_cast.
С boost::shared_ptr поступаем аналогично:
#include <boost/shared_ptr.hpp>
class CBase {};
class CDerived : public CBase {};
int main()
{
boost::shared_ptr<CBase> pBase(new CDerived);
boost::shared_ptr<CDerived> pDerived = boost::shared_static_cast<CDerived>(pBase);
}
Здравствуйте, Аноним, Вы писали:
Ага, работает!
Проверил, оба преобразования увеличивают счетчик на derived и копируют его в base
boost::static_pointer_cast
boost::shared_static_cast
А
boost::any_cast<boost::shared_ptr<CDerived> > (pBase);
кстати, выбросил boost::bad_any_cast& e исключение. Должен? Он же любой обьект может обрабатывать, те и shared_ptr