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

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

Я вообще прохожуshared_ptrs по ссылке, чтобы избежать ненужной копии:

int foo(const shared_ptr& ptr);

но это нене работает, если я пытаюсь сделать что-то вроде

int foo(const shared_ptr& ptr);

...

shared_ptr bar = make_shared();
foo(bar);

Я мог бы использовать

foo(dynamic_pointer_cast(bar));

но это кажется неоптимальным по двум причинам:

dynamic_cast кажется немного чрезмерным для простого приведения от основания к основанию.Как я понимаю,dynamic_pointer_cast создает копию (хотя и временную) указателя для передачи в функцию.

Есть ли лучшее решение?

Обновление для потомков:

Оказалось, это проблема отсутствующего заголовочного файла. Кроме того, то, что я пытался сделать здесь, считается антипаттерном. В общем-то,

Функции, которые невоздействовать на объектВремя жизни (то есть объект остается действительным в течение всей функции) должно принимать простую ссылку или указатель, например, ,int foo(bar& b)

Функции, которыепотреблять объект (то есть конечные пользователи данного объекта) должен взятьunique_ptr по стоимости, напримерint foo(unique_ptr b), Абоненты должныstd::move значение в функцию.

Функции, которые продлевают время жизни объекта, должныshared_ptr по стоимости, напримерint foo(shared_ptr b), Обычный совет, чтобы избежатьциркулярные ссылки применяется.

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

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

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