Каков наилучший способ передать a shared_ptrпроизводного типа функции, которая принимает shared_ptra базового типа?
Я обычно передаю shared_ptrs по ссылке, чтобы избежать ненужной копии:
int foo(const shared_ptr<bar>& ptr);
но это не сработает, если я попытаюсь сделать что-то вроде
int foo(const shared_ptr<Base>& ptr);
...
shared_ptr<Derived> bar = make_shared<Derived>();
foo(bar);
Я мог бы использовать
foo(dynamic_pointer_cast<Base, Derived>(bar));
но это кажется неоптимальным по двум причинам:
- A
dynamic_castкажется немного чрезмерным для простого приведения типа производного к основному. - Насколько я понимаю,
dynamic_pointer_castсоздает копию (пусть и временную) указателя для перехода к функции.
Есть ли лучшее решение?
Обновление для потомков:
Оказалось, проблема в отсутствующем файле заголовка. Кроме того, то, что я пытался здесь сделать, считается антипаттерном. В общем-то,
Функции, которые не влияют на время жизни объекта (т. Е. Объект остается действующим на время выполнения функции), должны принимать простую ссылку или указатель, например
int foo(bar& b).Функции, которые потребляют объект (т.е. являются конечными пользователями данного объекта), должны принимать
unique_ptrпо значению, напримерint foo(unique_ptr<bar> b). Вызывающие должны указатьstd::moveзначение в функции.Функции, продлевающие время жизни объекта, должны принимать
shared_ptrпо значению, напримерint foo(shared_ptr<bar> b). Применяется обычный совет избегать циклических ссылок .
См. Доклад Херба Саттера « Назад к основам» .
shared_ptr? Почему нет постоянной ссылки бара?