как downcast для boost::shared_ptr?
От: Аноним  
Дата: 16.10.06 22:13
Оценка:
Привет, Олл!
Пробую 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? Правильно ли это вообще?
Re: как downcast для boost::shared_ptr?
От: Аноним  
Дата: 16.10.06 22:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет, Олл!

А>Пробую 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 — это умный указатель, а не ссылка.
Re: как downcast для boost::shared_ptr?
От: Greg Zubankov СССР  
Дата: 17.10.06 09:27
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Привет, Олл!

А>Пробую 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);
}
Re[2]: как downcast для boost::shared_ptr?
От: gok Россия  
Дата: 17.10.06 21:39
Оценка:
Здравствуйте, Аноним, Вы писали:

Ага, работает!
Проверил, оба преобразования увеличивают счетчик на 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
gok
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.