Gibt es ein richtiges "Ownership-in-a-Package" für "Griffe"?

Griffe haben richtige Semantik außer Zeigern. Also für mich ein Beispiel wie dieses (extrahiert aus demRegel der Null):

class module {
public:
    explicit module(std::wstring const& name)
    : handle { ::LoadLibrary(name.c_str()), &::FreeLibrary } {}

    // other module related functions go here

private:
    using module_handle = std::unique_ptr<void, decltype(&::FreeLibrary)>;

    module_handle handle;
};

mitunique_ptr Als 'Ownership-in-a-Package' für Griffe ist dies ein schlechtes Beispiel. Erstens nutzt es das interne Wissen, dass das Handle ein Zeigertyp ist, und verwendet dies, um ein zu erstellenunique_ptr auf den Basistyp baut der "opake" Grifftyp auf.

Handles können jeder Typ sein, sie können ein Zeiger sein, sie können ein Index sein oder wer weiß. Am wichtigsten ist, was Sie zur Hand haben (von den meisten C-APIs zum Beispiel), ist ein Handle und dessen Ressourcenfreigabefunktion.

Gibt es ein richtiges "Ownership-in-a-Package" dafür?funktioniert in der Griffsemantik? Ich meine, bereits öffentlich verfügbar für eine zu verwenden?

Für mich,unique_ptr et. al. funktioniert nicht, ich muss unnötige Annahmen über den Typ des Handles treffenist, wenn ich nur durch den undurchsichtigen Grifftyp und seine Freigabefunktion ein Eigentumsrecht an einem Paket erhalten möchte.

Es ist nicht sinnvoll, einen Blick in den Handle-Typ zu werfen, um anhand dieser Informationen Konstruktionen anzufertigen. Es ist ein Griff, es sollte keine Rolle spielen.

Ich zitiere hier die Gefühle eines anderen SO Users ineine andere Frage ist Antworten:

Erstellen Sie eine bestimmte "Smart Pointer" -Klasse, die nicht lange dauert. Missbrauche keine Bibliotheksklassen. Die Handle-Semantik unterscheidet sich erheblich von der eines C ++ - Zeigers. Zum einen macht die Dereferenzierung eines GRIFFS keinen Sinn.

Ein weiterer Grund für die Verwendung einer benutzerdefinierten Smart-Handle-Klasse: NULL bedeutet nicht immer ein leeres Handle. Manchmal ist es INVALID_HANDLE_VALUE, was nicht dasselbe ist.

Haftungsausschluss:

Diese Frage formuliert und baut auf dieser auf:

Wo ist die richtige (Ressourcenhandhabungs-) Nullregel?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage