shared_ptr и кастинг
От: Аноним  
Дата: 10.02.04 13:25
Оценка:
есть полиморфная иерархия обьектов
struct Base
{
    virtual ~Base();
};
struct Derived : public Base {}

есть список указателей на базовые обьекты
std::list<boost::shared_ptr<Base> > my_list;

допустим я как-то получаю из этого списка необходимый мне элемент
как передать его в функцию, которая ожидает boost::shared_ptr<Derived>?
можно разименовать указатель на Base, сделать ему dynamic_cast, и если всё хорошо, создать нужный тип, но тогда потеряется счетчик и произойдет двойное удаление в деструкторе list.
Re: shared_ptr и кастинг
От: WolfHound  
Дата: 10.02.04 13:42
Оценка: 1 (1) +1
Здравствуйте, <Аноним>, Вы писали:

А>можно разименовать указатель на Base, сделать ему dynamic_cast, и если всё хорошо, создать нужный тип, но тогда потеряется счетчик и произойдет двойное удаление в деструкторе list.

Фрагмент shared_ptr.hpp
...
template<class T, class U> shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const & r)
{
    return shared_ptr<T>(r, detail::dynamic_cast_tag());
}
...

Ы?
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: shared_ptr и кастинг
От: Аноним  
Дата: 10.02.04 14:20
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, <Аноним>, Вы писали:


А>>можно разименовать указатель на Base, сделать ему dynamic_cast, и если всё хорошо, создать нужный тип, но тогда потеряется счетчик и произойдет двойное удаление в деструкторе list.

WH>Фрагмент shared_ptr.hpp
WH>
WH>...
WH>template<class T, class U> shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const & r)
WH>{
WH>    return shared_ptr<T>(r, detail::dynamic_cast_tag());
WH>}
WH>...
WH>

WH>Ы?
вот лопухнулся-то
надо было просто внимательнее прочитать по shared_ptr
спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.