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