Domanda

Sto cercando di migrare una soluzione usando i puntatori a uno usando unique_ptr, per semplificare la gestione delle risorse.Sono a conoscenza della semantica del movimento e dell'uso di std::move() per lavorare con unique_ptr.

Attualmente ho una funzione con la firma int foo(const T2DMatrix* m) e lo chiamo usando un oggetto 2D-Matrix allocato dinamicamente.Funzione foo richiede solo l'accesso in sola lettura alla classe T2DMatrix, da cui l'argomento const.Ora, ho migrato questo a int foo(unique_ptr<const T2DMatrix>& m).Da una funzione diversa, process(), che ha un unique_ptr<T2DMatrix> oggetto (creato usando una funzione factory), voglio passare l'oggetto a foo come parametro.Tuttavia, il compilatore non mi consente di farlo.Si prega di notare, non voglio trasferire la proprietà dell'oggetto da process() per foo(), da qui l'uso di riferimenti.Chiamare foo () con un unique_ptr<const T2DMatrix> funziona bene, tuttavia la garanzia const non verrà applicata se cambio la firma della funzione.

Nota:una soluzione che ho trovato è creare un nuovo unique_ptr<const T2DMatrix> oggetto in process (), trasferisci la proprietà ad esso dall'originale unique_ptr<T2DMatrix> oggetto utilizzando std::move(), passalo a foo (), e di nuovo trasferisci la proprietà in process ().Ma questa non sembra la soluzione ideale.

Si prega di suggerire l'equivalente della soluzione del puntatore che mi permetteva di passare un argomento T2DMatrix* al parametro const T2DMatrix*.Ho provato a usare msvc2012, msvc2013 e g++4.8, tutti con gli stessi risultati.

È stato utile?

Soluzione

Se la funzione non richiede la proprietà, passare un riferimento semplice anziché un riferimento a unique_ptr:

int foo(T2DMatrix const& m);


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

Non c'è bisogno di vincolare artificialmente foo per unique_ptrs se la funzione non si preoccupa comunque della proprietà.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top