Який найкращий метод використовувати передачу shared_ptr
похідного типу функції, яка приймає shared_ptr
a базового типу?
Я зазвичай передаю 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));
але це здається неоптимальним з двох причин:
- А
dynamic_cast
здається трохи надмірним для простого похідного акторського складу. - Як я розумію,
dynamic_pointer_cast
створює копію (хоча і тимчасову) вказівника для передачі функції.
Чи є краще рішення?
Оновлення для нащадків:
Це виявилося проблемою відсутнього файлу заголовка. Крім того, те, що я намагався зробити тут, вважається антиобразцем. Як правило,
Функції , які не впливають життя об'єкта (тобто об'єкт залишається в силі в протягом терміну дії функції) повинні взяти звичайну посилання або покажчик, наприклад
int foo(bar& b)
.Функції, які споживають об'єкт (тобто є кінцевими користувачами даного об'єкта), повинні приймати
unique_ptr
значення by, наприкладint foo(unique_ptr<bar> b)
. Викличники повинні ввестиstd::move
значення у функцію.Функції, що продовжують час життя об'єкта, повинні приймати
shared_ptr
значення за значенням, наприкладint foo(shared_ptr<bar> b)
. Застосовується звичайна порада уникати циркулярних посилань .
Детальніше див. У розмові Herb Sutter « Назад до основ» .
shared_ptr
? Чому немає констант-посилання на бар?