Jaka jest najlepsza metoda przekazywania a shared_ptr
typu pochodnego do funkcji, która przyjmuje shared_ptr
typ podstawowy?
Generalnie przekazuję shared_ptr
je jako odniesienie, aby uniknąć niepotrzebnych kopii:
int foo(const shared_ptr<bar>& ptr);
ale to nie działa, jeśli spróbuję zrobić coś takiego
int foo(const shared_ptr<Base>& ptr);
...
shared_ptr<Derived> bar = make_shared<Derived>();
foo(bar);
mógłbym użyć
foo(dynamic_pointer_cast<Base, Derived>(bar));
ale wydaje się to nieoptymalne z dwóch powodów:
dynamic_cast
Wydaje się nieco nadmierne dla prostego pochodzi do podstawy obsady.- Jak rozumiem,
dynamic_pointer_cast
tworzy kopię (choć tymczasową) wskaźnika, aby przejść do funkcji.
Czy jest lepsze rozwiązanie?
Aktualizacja dla potomnych:
Okazało się, że był to problem z brakującym plikiem nagłówkowym. Poza tym to, co próbowałem tutaj zrobić, jest uważane za anty-wzór. Ogólnie,
Funkcje, które nie wpływają na czas życia obiektu (tj. Obiekt pozostaje ważny przez czas trwania funkcji) powinny przyjmować zwykłe odwołanie lub wskaźnik, np
int foo(bar& b)
.Funkcje, które konsumują obiekt (czyli są końcowymi użytkownikami danego obiektu) powinny przyjmować
unique_ptr
wartość, npint foo(unique_ptr<bar> b)
. Wzywający powinnistd::move
podać wartość do funkcji.Funkcje wydłużające żywotność obiektu powinny przyjmować
shared_ptr
wartość, npint foo(shared_ptr<bar> b)
. Obowiązuje zwyczajowa rada, aby unikać odwołań cyklicznych .
Szczegóły w artykule Herba Suttera Back to Basics .
shared_ptr
? Dlaczego brak odniesienia do stałej baru?