Deseo devolver dos valores, uno de los cuales es un objeto nuevo. Puedo hacer esto utilizando std::pair
:Devolución de un nuevo objeto junto con otro valor
class A {
//...
};
std::pair<A*, int> getA()
{
A* a = new A;
//...
}
Para hacer que el código de excepción de seguridad, me gustaría hacer:
std::pair<std::auto_ptr<A>, int> getA()
{
std::auto_ptr<A> a(new A);
//...
}
Pero esto no se compilará como el auto_ptr
no se puede copiar sin modificar el auto_ptr
siendo copiado. Ok, esto significa que auto_ptr
no se combina bien con otros tipos (de una forma más). ¿Cuál es una buena forma de devolver un objeto nuevo en este caso?
Una alternativa es devolver un shared_ptr
y otra es una referencia inout. Pero estoy buscando alguna otra alternativa. Puedo hacer algo como:
class AGetter
{
void getAExecute()
{
//...
// set a_ and i_
}
std::auto_ptr<A> getA() const
{
return a_.release();
}
int getInt() const
{
return i_;
}
private:
std::auto_ptr<A> a_;
int i_;
};
¿Hay una manera mejor?
shared_ptr es ligeramente/trivialmente ineficiente y viral. Argumentos no muy sólidos contra shared_ptr, pero aún así hacen un factor en contra de ellos (en 10% de los casos). –
Afortunadamente, el siguiente estándar contiene unique_ptr, que se puede mover junto con el par que lo contiene. –