He pasado bastante tiempo implementando la semántica de movimientos para mi clase, pero ahora estoy tratando con funciones que lo usan.Semantics de movimiento y referencias de referencias
Bien, entonces tengo este objeto que tiene una gran cantidad de datos en el montón: CLargeOb
para el cual implementé la semántica de movimiento (constructor y operator =). Idealmente se utiliza como esto:
void OtherOb::Func(CLargeOb&& largeOb1, CLargeOb&& largeOb2)
{
SomeOtherFunc(largeOb1); // use objects
SomeOtherFunc(largeOb2);
m_largeOb1 = (CLargeOb&&)largeOb1; // save as members and trash the originals
m_largeOb2 = (CLargeOb&&)largeOb2;
}
Sin embargo, no siempre es posible permitir que los objetos se muevan/papelera, por lo que añadió estas dos funciones:
void OtherOb::Func(const CLargeOb& largeOb1, CLargeOb&& largeOb2)
{
SomeOtherFunc(largeOb1);
SomeOtherFunc(largeOb2);
m_largeOb1 = largeOb1;
m_largeOb2 = (CLargeOb&&)largeOb2;
}
void OtherOb::Func(CLargeOb&& largeOb1, const CLargeOb& largeOb2)
{
SomeOtherFunc(largeOb1);
SomeOtherFunc(largeOb2);
m_largeOb1 = (CLargeOb&&)largeOb1;
m_largeOb2 = largeOb2;
}
aunque funciona, ya se puede Supongo que se convertirá en un gran dolor en el * ss cuando tengo una función que toma 3 o más de estos objetos como parámetros ... ¿No hay una manera inteligente de resolver esto usando plantillas o tal vez 'reenvío perfecto'?
@MooingDuck: funciona bien en VS2010, no hay problema. Para invocar el operador = (&&) debe llamarlo de manera explícita usando std :: move o && cast. Pero la solución proporcionada debajo es mucho mejor, por supuesto. – demorge
@demorge: ah, claro, me olvidé por completo de que las reglas cambian cuando recibe su nombre. Lo siento por eso –
Por favor, escriba 'std :: move (largeOb1)' en lugar de '(CLargeOb &&) largeOb1'. Generaciones de programadores por venir le agradecerán por usar la forma estándar de C++ 11 de habilitar un movimiento en lugar de una mezcla C/C++ no idiomática y límite ilegible. – fredoverflow