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