Frage

Ich versuche, eine Lösung mit Zeigern auf eine mit unique_ptr zu migrieren, um die Ressourcenhandhabung zu vereinfachen.Ich bin mir der Bewegungssemantik und der Verwendung von bewusst std::move() um mit unique_ptrs zu arbeiten.

Derzeit habe ich eine Funktion mit der Signatur int foo(const T2DMatrix* m) und ich nenne das mit einem dynamisch zugewiesenen 2D-Matrix-Objekt.Funktion foo erfordert nur schreibgeschützten Zugriff auf die Klasse T2DMatrix, daher das Argument const .Jetzt habe ich das migriert nach int foo(unique_ptr<const T2DMatrix>& m).Aus einer anderen Funktion, process(), die eine hat unique_ptr<T2DMatrix> objekt (erstellt mit einer Factory-Funktion), ich möchte das Objekt als Parameter an foo übergeben.Der Compiler erlaubt mir das jedoch nicht.Bitte beachten Sie, dass ich das Eigentum an dem Objekt nicht übertragen möchte von process() zu foo(), daher die Verwendung von Referenzen.Aufruf von foo() mit einem unique_ptr<const T2DMatrix> funktioniert einwandfrei, aber die konstante Garantie würde nicht erzwungen, wenn ich die Funktionssignatur ändere.

Beachten:eine Lösung, die ich gefunden habe, besteht darin, eine neue zu erstellen unique_ptr<const T2DMatrix> objekt in Bearbeitung (), übertragen Sie das Eigentum vom Original darauf unique_ptr<T2DMatrix> objekt mit std::move(), übergeben Sie es an foo() und übertragen Sie erneut das Eigentum in process() .Dies scheint jedoch kaum die ideale Lösung zu sein.

Bitte schlagen Sie das Äquivalent der Zeigerlösung vor, mit der ich ein T2DMatrix * -Argument an den Parameter const T2DMatrix * übergeben konnte.Ich habe versucht, msvc2012, msvc2013 und g ++ 4.8 zu verwenden, alle mit den gleichen Ergebnissen.

War es hilfreich?

Lösung

Wenn für die Funktion kein Besitz erforderlich ist, übergeben Sie eine einfache Referenz anstelle einer Referenz auf unique_ptr:

int foo(T2DMatrix const& m);


std::unique_ptr<T2DMatrix> matrixptr;
[...]
foo(*matrixptr);

Es besteht keine Notwendigkeit, künstlich einzuschränken foo zu unique_ptrs wenn sich die Funktion sowieso nicht um Eigentum kümmert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top