Pergunta

Estou tentando migrar uma solução usando ponteiros para um usando unique_ptr, para simplificar a manipulação de recursos.Estou ciente de mover semântica e o uso de std::move() para trabalhar com unique_ptr s.

Atualmente eu tenho uma função com a assinatura int foo(const T2DMatrix* m) e eu chamo isso usando um alocada dinamicamente 2D-Matriz de objeto.A função foo requer apenas acesso somente leitura para T2DMatrix de classe, daí o constante argumento.Agora, eu tenho migrado para este int foo(unique_ptr<const T2DMatrix>& m).A partir de uma função diferente, process(), que tem um unique_ptr<T2DMatrix> objeto (criado usando uma fábrica de função), eu quero passar o objeto foo como parâmetro.No entanto, o compilador não me permitem fazer isso.Por favor note que eu não quero transferir a propriedade do objeto a partir de process() para foo(), daí o uso de referências.Chamar foo() com um unique_ptr<const T2DMatrix> funciona bem, no entanto, a constante de garantia não seria imposta, se eu alterar a função de assinatura.

Nota:uma solução que eu encontrei é criar um novo unique_ptr<const T2DMatrix> objeto no processo de(), a transferência da propriedade para o mesmo do original unique_ptr<T2DMatrix> objeto usando std::move(), passá-lo para foo(), e novamente a transferência da propriedade no processo de().Mas esta não parece ser a solução ideal.

Por favor, sugira o equivalente do ponteiro solução que foi o que me permite passar um T2DMatrix* argumento para const T2DMatrix* parâmetro.Eu tentei usar msvc2012, msvc2013 e g++4.8, todos com os mesmos resultados.

Foi útil?

Solução

Se a função não necessitam de propriedade, passar de uma simples referência, em vez de uma referência para unique_ptr:

int foo(T2DMatrix const& m);


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

Não há necessidade de se restringir artificialmente foo para unique_ptrs se a função não se preocupa com a propriedade de qualquer maneira.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top