Каков наилучший способ передать a shared_ptr
производного типа функции, которая принимает shared_ptr
a базового типа?
Я обычно передаю shared_ptr
s по ссылке, чтобы избежать ненужной копии:
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
? Почему нет постоянной ссылки бара?