Czy istnieje standardowa klasa wskaźnika (lub funkcja Boost), która jest wskaźnikiem niewspółużytkowanym, który działa z niekompletnymi typami? Przeszedłem przez standard C++ 11 i bibliotekę boost i nie mogę go znaleźć, choć wydaje się bardzo przydatny.Niewspółużytkowany wskaźnik inteligentny z niekompletnymi typami
Na przykład chciałbym móc tworzyć nieprzezroczyste typy za pomocą inteligentnego wskaźnika.
class A;
wrap_ptr<A> some_func();
void other_func(A const &);
A
jest typu nieprzezroczysty, które mogą być wykorzystywane do różnych zadań. Użytkownik powyższego interfejsu ma tylko niepełną definicję A, ale powinien mieć możliwość usunięcia/zresetowania wskaźnika. Wiem, że powyższe można zrobić z shared_ptr
, ale to ma narzut, którego nie chcę w tym szczególnym kodzie. unique_ptr
ma odpowiednią semantykę własności, ale nie może pracować z niekompletnym typem. Teoretycznie owijka powinna potrzebować tylko narzut posiadania wskaźnika do deletera.
Czy istnieje taki typ w C++ 11 lub w bibliotekach boost?
UWAGA: Rozumiem, że mogę łatwo zbudować ten typ, ale preferuję standardowy typ, jeśli to możliwe. Wygląda na to, że powinien to być podstawowy typ inteligentnego wskaźnika.
UPDATE: unique_ptr
nie wydaje się być dobrym rozwiązaniem. Po pierwsze narzut składni będzie kompensacją. Po drugie, nie jestem przekonany, czy można go bezpiecznie stosować z niestandardowym deleterem. Sprawdzę, jak to działa.
Chociaż pod względem technicznym jest prawdą, użycie tego bezpośrednio jest niepoprawne syntaktycznie. Nie możesz po prostu zrobić 'ptr_type (new T)', ale zakładając, że szablon jest poprawny, musisz wykonać 'ptr_type (new T, T :: ~ T)'. –
W rzeczywistości, patrząc ściśle 'unique_ptr' nie można użyć niestandardowego deletera ze stanem. Funkcja 'reset' nie pozwala na określenie deletera, tylko konstruktor robi, dlatego niestandardowy aspekt usuwania' unique_ptr' jest częściowo uszkodzony. –
Nie ma potrzeby stosowania niestandardowego narzędzia usuwającego, typ musi być wypełniony tylko wtedy, gdy zostanie wywołany destruktor 'unikalnego_ptr', co oznacza, że można zdefiniować destruktor po zakończeniu utrzymywanej klasy. – Xeo