2012-04-04 16 views
9

In assenza di modelli variadici (ancora!) In Visual Studio 2010/2011, un costruttore che accetta molti parametri può essere problematico. Ad esempio, il seguente non verrà compilato:std :: make_shared numero di parametri nel costruttore

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

, perché ha 13 parametri e penso make_shared è limitata da arg0 a arg9. Il lavoro ovvio è una costruzione in due parti, ma speravo di evitarlo. C'è qualche altra possibilità qui, a parte l'uso di new invece di make_shared?

Grazie.

risposta

20

È possibile utilizzare la costruzione di una classe che verrà quindi spostata nel valore assegnato dell'heap.

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

Ah. Ovviamente. Questo ha perfettamente senso. – Robinson

+0

La cosa buona è che make_shared utilizzerà anche una routine di allocazione ottimizzata durante la creazione di shared_ptr –

+0

Mi dispiace - Non vedo come questo eviti di copiare dallo stack locale (dove Material() viene costruito) all'heap (dove make_shared sarà effettivamente mettilo a posto). In questo caso, come si può evitare la copia? – Mordachai

1

è possibile creare una "struttura di input" con tutti i membri pertinenti.
riempirlo con i valori corretti e chiamare il costruttore con quello come suo unico parametro.

+0

Anche una buona idea, ma voglio evitare estranee strutture "casuali" per cose come questa :-). – Robinson

Problemi correlati