2012-04-04 7 views
9

Wenn in Visual Studio 2010/2011 keine Variadic-Vorlagen (noch!) Vorhanden sind, kann ein Konstruktor, der viele Parameter benötigt, problematisch sein. Zum Beispiel kompilieren folgendes nicht:std :: make_shared Anzahl der Parameter im Konstruktor

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

, weil es 13 Parameter hat, und ich denke make_shared von arg0 beschränkt auf Arg9. Die offensichtliche Umgehung ist eine zweiteilige Konstruktion, aber ich hatte gehofft, das zu vermeiden. Gibt es hier eine andere Möglichkeit, abgesehen von der Verwendung von neue anstelle von make_shared?

Danke.

Antwort

20

Sie können eine Klasse konstruieren, die dann in den zugewiesenen Heap-Wert verschoben wird.

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

Ah. Na sicher. Das macht vollkommen Sinn. – Robinson

+0

Die gute Sache ist, dass make_shared auch eine optimierte Allokationsroutine beim Erstellen von shared_ptr verwendet. –

+0

Entschuldigung - ich sehe nicht, wie dies das Kopieren vom lokalen Stack (wo Material() konstruiert wird) zum Heap (wo make_shared wird) Setzen Sie es ab). Wie kann in diesem Fall die Kopie möglicherweise vermieden werden? – Mordachai

1

Sie können eine "Eingabestruktur" mit allen relevanten Mitgliedern erstellen.
füllen Sie es mit den richtigen Werten und rufen Sie den Konstruktor damit als seinen einzigen Parameter.

+0

Auch eine gute Idee, aber ich will überflüssige "zufällige" Strukturen für solche Dinge vermeiden :-). – Robinson