Mam problem z obejściem tego. Załóżmy, że mam ten wektorKonwersja z polimorfizmu shared_ptr na weak_ptr
std::vector<std::shared_ptr<Car>> cars;
Samochód jest klasą abstrakcyjną. Chcę móc zwracać słabe wskaźniki różnych typów, więc wykonuję następujące czynności.
template<typename T>
std::weak_ptr<T> GetCar()
{
for (std::vector<std::shared_ptr<Car>>::iterator it = cars.begin(); it != cars.end(); ++it)
{
T* derived = dynamic_cast<T*>((*it).get());
if (derived != nullptr)
{
std::weak_ptr<T> carPointer = *it;
return carPointer;
}
}
return std::weak_ptr<T>();
}
Otrzymuję następujący błąd, gdy próbuję użyć funkcji z klasą, która dziedziczy z samochodu. Error C2440 'initializing': cannot convert from 'std::shared_ptr<Car>' to 'std::weak_ptr<Saab>'
Na żądanie może nie być prawidłowego samochodu. Próbowałem użyć boost :: optional, ale nie radzi sobie z polimorfizmem. Mogę iść z surowymi wskazówkami, jeśli nie mogę tego zrobić.
Typ wskazywany przez 'shared_ptr' i' weak_ptr' musi być taki sam. Zrobiłbym to w trzech krokach: zwróć 'weak_ptr' następnie przekształć go w 'shared_ptr ', a następnie w 'T *'. –
Dzięki za szybką odpowiedź @MarkRansom Mmm. Jest to funkcja użytkownika biblioteki, więc wolałbym nie udostępniać programisty, który mógłby z niego korzystać. Powinienem tak powiedzieć, mój zły. Czy poleciłbyś pracę tylko z surowymi wskazówkami, aby móc zwrócić jeden? Lub zwracając wyprowadzone nawet, – miniconco
Z pewnością możesz mieć jedną funkcję, która wykonuje wszystkie trzy kroki, ale celem konwersji 'weak_ptr' na' shared_ptr' jest utrzymywanie obiektu przy życiu podczas pracy z nim; umieszczenie 'shared_ptr' w tymczasowe porażki w tym celu. –