Передача shared_ptr <Derived> как shared_ptr <Base>

Каков наилучший способ пройтиshared_ptr производного типа к функции, которая принимаетshared_ptr базового типа?

Я вообще прохожу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), Обычный совет, чтобы избежатьциркулярные ссылки применяется.

Смотрите Херб СаттерсВернуться к основам разговоров для деталей.

Ответы на вопрос(4)

Ваш ответ на вопрос