Question

J'essaie de migrer une solution utilisant des pointeurs vers une solution utilisant unique_ptr, pour simplifier la gestion des ressources.Je connais la sémantique des mouvements et l'utilisation de std::move() travailler avec unique_ptr.

Actuellement j'ai une fonction avec la signature int foo(const T2DMatrix* m) et j'appelle cela en utilisant un objet 2D-Matrix alloué dynamiquement.La fonction foo nécessite uniquement un accès en lecture seule à la classe T2DMatrix, d'où l'argument const.Maintenant, j'ai migré ceci vers int foo(unique_ptr<const T2DMatrix>& m).D'une fonction différente, process(), qui a un unique_ptr<T2DMatrix> objet (créé à l'aide d'une fonction d'usine), je souhaite transmettre l'objet à foo comme paramètre.Cependant, le compilateur ne me permet pas de le faire.Attention, je ne souhaite pas transférer la propriété de l'objet de process() à foo(), d'où l'utilisation de références.Appeler foo() avec un unique_ptr<const T2DMatrix> fonctionne bien, mais la garantie const ne sera pas appliquée si je modifie la signature de la fonction.

Note:une solution que j'ai trouvée est de créer un nouveau unique_ptr<const T2DMatrix> objet en cours(), transférez-lui la propriété de l'original unique_ptr<T2DMatrix> objet utilisant std::move(), transmettez-le à foo(), puis transférez à nouveau la propriété dans process().Mais cela ne semble pas être la solution idéale.

Veuillez suggérer l'équivalent de la solution de pointeur qui me permettait de passer un argument T2DMatrix* au paramètre const T2DMatrix*.J'ai essayé d'utiliser msvc2012, msvc2013 et g++4.8, tous avec les mêmes résultats.

Était-ce utile?

La solution

Si la fonction ne nécessite pas de propriété, transmettez une référence simple au lieu d'une référence à unique_ptr:

int foo(T2DMatrix const& m);


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

Il n'est pas nécessaire de contraindre artificiellement foo à unique_ptrs si la fonction ne se soucie pas de la propriété de toute façon.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top