Ein nicht gemeinsam genutzter intelligenter Zeiger mit unvollständigen Typen

8

Gibt es eine Standardzeigerklasse (oder Boost), bei der es sich um einen nicht gemeinsam genutzten Zeiger handelt, der mit unvollständigen Typen arbeitet? Ich bin über den C ++ 11-Standard und die Boost-Bibliothek gegangen und kann keinen finden, obwohl es wie ein sehr nützlicher Typ erscheint.

Ich möchte zum Beispiel in der Lage sein, opake Typen mit einem intelligenten Zeiger zu erstellen.

%Vor%

A ist ein undurchsichtiger Typ, der für eine Vielzahl von Funktionen verwendet werden kann. Der Benutzer der obigen Schnittstelle hat nur eine unvollständige Definition von A, sollte aber den Zeiger löschen / zurücksetzen können. Ich weiß, dass das oben mit einem shared_ptr getan werden kann, aber das hat einen Overhead, den ich in diesem bestimmten Code nicht will. unique_ptr hat die richtige Besitz-Semantik, kann aber nicht mit einem unvollständigen Typ arbeiten. In der Theorie sollte ein Wrapper nur den Overhead eines Verweises auf einen Deleter benötigen.

Gibt es einen solchen Typ in C ++ 11 oder den Boost-Bibliotheken?

HINWEIS: Ich verstehe, dass ich diesen Typ leicht erstellen kann, aber ich würde einen Standardtyp bevorzugen, wenn möglich. Es scheint, als ob es sich um einen grundlegenden intelligenten Zeigertyp handeln sollte.

UPDATE : unique_ptr scheint keine gute Option zu sein. Erstens würde der Syntax-Overhead ausgeglichen werden. Zweitens bin ich nicht überzeugt, dass es sicher mit einem benutzerdefinierten Deleter verwendet werden kann. Ich überprüfe, wie es funktionieren könnte.

    
edA-qa mort-ora-y 30.01.2012, 09:26
quelle

3 Antworten

9

Um klar zu sein über unique_ptr: Es funktioniert mit unvollständigen Typ, aber wenn Sie es in einer Kopfzeile einer Klasse wie folgt verwenden:

%Vor%

Es wird wegen der fehlenden Deleter-Implementierung keine Verbindung hergestellt. Es gibt eine einfache Lösung: Definieren Sie einfach de Destruktor der Host-Klasse in einem cpp, auch wenn es leer ist oder sollte der Standard-sein!

%Vor%

Lesen Sie auch die Antworten auf meine Frage: Ist std :: unique_ptr & lt; T & gt; benötigt, um die vollständige Definition von T zu kennen?

Und vielleicht werfen Sie einen Blick darauf, wie pimpl idiom (implizierender Typ in einem unique_ptr) empfohlen wird, um von Herb Sutter ergänzt zu werden: Ссылка

    
Klaim 30.01.2012 13:14
quelle
4

Tatsächlich kann unique_ptr mit unvollständigen Typen arbeiten, solange Sie einen benutzerdefinierten Deleter angeben.

Im Gegensatz zu shared_ptr wirkt sich dies jedoch auf seinen Typ aus, da der benutzerdefinierte Löschvorgang statisch (als zweiter Vorlagenparameter) präzisiert wird.

    
Matthieu M. 30.01.2012 09:33
quelle
1

std::unique_ptr kann diesen Fall behandeln, aber nicht mit dem Standardlöscher. Sie müssen einen Deleter schreiben, der einen unvollständigen Typ verarbeiten kann, und dann std::unique_ptr<A,MyDeleter> verwenden.

    
Anthony Williams 30.01.2012 09:34
quelle