Hier ist ein Problem, auf das ich oft mit RAII stoße. Ich habe mich gefragt, ob jemand eine gute Lösung dafür hat.
Beginnen Sie mit Ihrer standardmäßigen RAII-Dienstprogrammklasse:
%Vor%Jetzt muss ich aus verschiedenen Gründen eine Vorlage erstellen. Nehmen wir auch an, dass sein Konstruktor ein Argument vom Template-Parametertyp verwendet:
%Vor%Betrachten Sie nun eine Verwendungsseite:
%Vor% Es ist ärgerlich, SomeType
ausschreiben zu müssen, wenn es aus someObj
abgeleitet werden kann, also schreibe ich eine Hilfsfunktion, um den Typ abzuleiten:
Jetzt kann ich es so benutzen:
%Vor% Wunderbar, oder? Abgesehen davon gibt es einen Haken: RAIIHelper
muss jetzt kopierbar oder beweglich sein, und der Destruktor - der die Ressource freigibt - kann möglicherweise zweimal aufgerufen werden: einmal für das temporäre von makeRAIIHelper
zurückgegebene und einmal für die lokale Variable im Aufruf der Funktion.
In der Praxis führt mein Compiler RVO aus und der Destruktor wird nur einmal aufgerufen. Dies ist jedoch nicht garantiert. Das kann man an der Tatsache sehen, dass wenn ich versuche, RAIIHelper
a = delete
'd move-Konstruktor zu geben, der Code nicht mehr compiliert.
Ich könnte RAIIHelper einen zusätzlichen Status hinzufügen, so dass es nach dem Verschieben von ReleaseTheResource()
nicht aufrufen kann, aber das ist zusätzliche Arbeit, die unnötig war, bevor ich makeRAIIHelper()
hinzugefügt habe, um den Typabzug zu erhalten.
Gibt es eine Möglichkeit, den Typabzug zu bekommen, ohne extra Staat zu RAIIHelper
hinzufügen zu müssen?
Aufbauend auf den vorherigen Antworten und Kommentaren:
Sie können die Verantwortung für die Verschiebung zu unique_ptr abgeben und Ihre Ressource wie folgt zurückgeben:
%Vor%Jetzt ist es wie eine statische Variable, aber möglicherweise nicht kopierbar & amp; unbeweglich.