2014-02-27 6 views
7

Ich versuche, eine Lösung mithilfe von Zeigern zu einem mithilfe von unique_ptr zu migrieren, um die Ressourcenbehandlung zu vereinfachen. Ich bin bewusst, bewegen Semantik und die Verwendung von std::move() mit unique_ptrs arbeiten.C++ unique_ptr Konstantenreferenz

Momentan habe ich eine Funktion mit der Signatur int foo(const T2DMatrix* m) und ich rufe diese mit einem dynamisch zugeordneten 2D-Matrix Objekt auf. Die Funktion foo benötigt nur den schreibgeschützten Zugriff auf die Klasse T2DMatrix, daher das Argument const. Jetzt habe ich dies auf int foo(unique_ptr<const T2DMatrix>& m) migriert. Von einer anderen Funktion, process(), die ein unique_ptr<T2DMatrix> Objekt hat (erstellt mit einer Factory-Funktion), möchte ich das Objekt als Parameter foo übergeben. Der Compiler erlaubt mir dies jedoch nicht. Bitte beachten Sie, dass ich das Eigentum des Objekts nicht von process() auf foo() übertragen möchte, daher die Verwendung von Referenzen. Das Aufrufen von foo() mit einer unique_ptr<const T2DMatrix> funktioniert gut, die const-Garantie wird jedoch nicht erzwungen, wenn ich die Funktionssignatur ändere.

Hinweis: eine Lösung, die ich gefunden habe, ist ein neues unique_ptr<const T2DMatrix> Objekt in process() zu erstellen, überträgt Eigentum, um es aus dem ursprünglichen unique_ptr<T2DMatrix> Objekt std::move() verwenden, übergeben Sie es() foo und wieder Eigentum in Verfahren übertragen (). Aber das scheint kaum die ideale Lösung zu sein.

Bitte schlagen Sie das Äquivalent der Zeigerlösung vor, die es mir ermöglichte, ein T2DMatrix * Argument an const T2DMatrix * Parameter zu übergeben. Ich versuchte mit msvc2012, msvc2013 und g ++ 4.8, alle mit den gleichen Ergebnissen.

+1

Funktioniert Ihre Funktion mit dem 'unique_ptr'? Oder handelt es sich nur um das Zielobjekt? –

+0

foo() befasst sich nur mit dem pointed-to-Objekt ... Du denkst an comicsansMS weiter unten ... Und die Idee macht Sinn. Ich sollte nur Referenzen anstelle von unique_ptr für den Foo-Parameter verwenden. Vielen Dank. –

Antwort

19

Wenn die Funktion Eigentum erfordert nicht, eine einfache Referenz unique_ptr zu anstelle eines Verweises übergeben:

int foo(T2DMatrix const& m); 


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

Es gibt keine Notwendigkeit künstlich foo-unique_ptr s zu beschränken, wenn die Funktion nicht ohnehin über das Eigentum schert.