RAII und abgeleitete Template-Argumente

8

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:

%Vor%

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?

    
HighCommander4 14.07.2014, 18:30
quelle

2 Antworten

8

Es gibt eine sehr einfache Lösung: Verwenden Sie einen Verweis auf das temporäre Objekt, anstatt es in eine lokale Variable zu kopieren.

%Vor%     
nosid 14.07.2014, 18:42
quelle
1

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.

    
Stian V. Svedenborg 14.07.2014 18:53
quelle

Tags und Links