Zgodnie z cppreference.com, std::shared_ptr
zapewnia pełny zestaw względnych operatorów (==,! =, <, ...), ale semantyki porównania nie są określone. Zakładam, że porównują one surowe wskaźniki do obiektów, do których się odwołują, i że std :: weak_ptr i std :: unique_ptr robią to samo.Czy można odziedziczyć po inteligentnych wskaźnikach C++ 11 i przesłonić operatorów względnych?
Dla niektórych celów wolałbym mieć operatorów względnych, którzy zamawiają inteligentne wskaźniki na podstawie porównywania przywoływanych obiektów (a nie wskaźników do nich). Jest to już coś, co robię bardzo często, ale z moimi własnymi "głupimi wskazówkami", które zachowują się jak surowe wskazówki, z wyjątkiem względnych operatorów. Chciałbym zrobić to samo ze standardowymi inteligentnymi wskaźnikami C++ 11. Więc ...
Czy można dziedziczyć z C++ (11 inteligentnych wskaźników shared_ptr, weak_ptr i unique_ptr) i zastąpić operatorów względne?
Czy są jakieś podstępne problemy, na które muszę zwrócić uwagę? Na przykład, czy istnieją inne metody potrzebne do wdrożenia lub użycia
using
dla zapewnienia, że rzeczy działają poprawnie?Dla najlepszego lenistwa, czy jest dostępny szablon biblioteki, który zrobi to automatycznie?
Mam nadzieję, że to "oczywiście możesz to zrobić, idioto!" Coś w tym rodzaju, ale jestem trochę niepewny, ponieważ w standardowej bibliotece znajduje się kilka klas (takich jak choćby pojemniki takie jak std::map
), z których nie powinno się dziedziczyć.
Ogólnie rzecz biorąc, nie jest bezpiecznie dziedziczyć po wszystkim, co destruktor nie jest dynamiczny. To może być i jest często wykonywane, po prostu musisz być ostrożny. –
@Mooing Duck - OK, późne wiązanie, które może być problemem dla destruktora i gdzie indziej - ma sens. Nie sądzę, że to jest dla mnie problem, przynajmniej w tej chwili, ale muszę to sprawdzić. Być może lepiej byłoby owinąć inteligentny wskaźnik jako element, a nie dziedziczyć. – Steve314
Er, przez "dynamiczny", mam oczywiście na myśli "wirtualny" –