2009-10-06 21 views
5

Digamos que tengo una clase:Inicialización objeto agregado temporal que se utilizan llaves

class Aggregate { 

public: 

    int x; 
    int y; 

}; 

Sé cómo inicializar un objeto utilizando llaves:

Aggregate a1 = { 1500, 2900 }; 

pero no puedo encontrar una adecuada sintaxis para crear un objeto temporal y pasarlo como argumento a algún método, por ejemplo:

void frobnicate(const Aggregate& arg) { 
    // do something 
} 

//... 

frobnicate(Aggregate {1500, 2900}); // what should this line look like? 

La manera más fácil sería agregar el constructor a la clase Aggregate, pero supongamos que no tengo acceso al encabezado Aggregate. Otra idea sería escribir algún tipo de método de fábrica, es decir,

Aggregate makeAggregate(int x, int y). 

También puede crear un objeto y luego pasarlo como argumento, etc., etc.

Hay muchas soluciones, pero yo' Me da curiosidad si es posible lograr este objetivo usando la inicialización de llaves.

+0

Uh ... Si no tiene acceso al encabezado, no puede suponer que el objeto es posible inicializar con llaves, ¿verdad? – unwind

+3

El enfoque makeXXX no es tan malo, en realidad. Los compiladores recientes pueden aplicar NRVO (optimización del valor de retorno) que conduce a un código eficiente. Cuando se aplica NRVO y la función está en línea, esto sería equivalente a la sintaxis de C++ 0x en términos de eficiencia. – sellibitze

Respuesta

8

Lo que desea es posible con las listas de inicializadores C++ 0x.

class Aggregate { 
public: 
    int x, y; 
}; 

void frobnicate(const Aggregate& arg) { 

} 

int main() { 
    frobnicate({1, 2}); 
    return 0; 
} 

GCC 4.4 ya soporta esto con -std=c++0x bandera. Posiblemente VS2010 CTP también lo admite (corríjame si me equivoco).

Con C++ 98/C++ 03 tendrá que escribir e invocar un constructor.

1

"Hay muchas soluciones, pero me da curiosidad si es posible lograr este objetivo utilizando la inicialización de llaves".

No es posible. Si no puede cambiar la fuente a continuación, sus únicas opciones son para envolver que, en una función en línea o una estructura de ayuda:

struct AggregateHelper 
{ 
    Aggregate a; 
    AggregateHelper(int x, int y) { a.x=x; a.y=y; } 
    operator const Aggregate&() { return a; } 
}; 

frobnicate(AggregateHelper(1500,2900)); 

edición: eliminado solución constructor irrelevante.

+0

Sin embargo, esto también cambia la propiedad del tipo de ser un Agregado (y también un POD en este caso) a un agregado. Esto puede no ser esperado, y requeriría una búsqueda y reemplazo para todas las {} inicializaciones anteriores. –

Cuestiones relacionadas