Передача shared_ptr <Derived> как shared_ptr <Base>
Каков наилучший способ пройтиshared_ptr
производного типа к функции, которая принимаетshared_ptr
базового типа?
Я вообще прохожуshared_ptr
s по ссылке, чтобы избежать ненужной копии:
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)
, Обычный совет, чтобы избежатьциркулярные ссылки применяется.
Смотрите Херб СаттерсВернуться к основам разговоров для деталей.