2012-04-04 11 views
9

En ausencia de plantillas variadic (¡todavía!) En Visual Studio 2010/2011, un constructor que toma muchos parámetros puede ser problemático. Por ejemplo, la siguiente no se compilará:std :: make_shared número de parámetros en el constructor

MyMaterials.push_back(std::make_shared<Material>(MyFacade, 
                name, 
                ambient, 
                diffuse, 
                specular, 
                emissive, 
                opacity, 
                shininess, 
                shininessStrength, 
                reflectivity, 
                bumpScaling, 
                maps, 
                mapFlags)); 

, ya que tiene 13 parámetros y creo make_shared se limita a arg0 a Arg9. El trabajo obvio es una construcción en dos partes, pero esperaba evitar esto. ¿Hay alguna otra posibilidad aquí, aparte del uso de nuevo en lugar de make_shared?

Gracias.

Respuesta

20

Puede usar construir una clase que luego se moverá al valor asignado en el montón.

MyMaterials.push_back(std::make_shared<Material>(
    Material(MyFacade, name, ambient, diffuse, specular, 
      emissive, opacity, shininess, shininessStrength, 
      reflectivity, bumpScaling, maps, mapFlags))); 
+0

Ah. Por supuesto. Eso tiene perfecto sentido. – Robinson

+0

Lo bueno es que make_shared también usará una rutina de asignación única optimizada al crear shared_ptr –

+0

Lo siento, no veo cómo esto evita copiar de la pila local (donde se está construyendo Material()) al montón (donde make_shared en realidad colocarlo). En este caso, ¿cómo se puede evitar la copia? – Mordachai

1

puede crear una "estructura de entrada" con todos los miembros relevantes.
llénelo con los valores correctos y llame al constructor con ese como su único parámetro.

+0

También es una buena idea, pero quiero evitar estructuras "aleatorias" extrañas para cosas como esta :-). – Robinson

Cuestiones relacionadas