Який найкращий метод використовувати передачу shared_ptrпохідного типу функції, яка приймає shared_ptra базового типу?
Я зазвичай передаю shared_ptrs за посиланням, щоб уникнути непотрібної копії:
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? Чому немає констант-посилання на бар?