2012-04-04 425 views
9

在Visual Studio 2010/2011中缺少可變參數模板(仍然!)的情況下,需要大量參數的構造函數可能會有問題。例如以下將無法編譯:std :: make_shared構造函數中的參數個數

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

,因爲它有13個參數,我認爲make_shared從arg0到arg9是有限的。明顯的解決方法是兩部分構建,但我希望避免這種情況。除了使用新的而不是make_shared之外,還有其他可能嗎?

謝謝。

回答

20

您可以使用構造一個類,然後將其移入堆分配值。

​​
+0

啊。當然。這很有道理。 – Robinson 2012-04-04 13:58:48

+0

好處是,make_shared在創建shared_ptr時也會使用優化的one-allocation例程 – 2012-04-04 14:00:08

+0

對不起 - 我不明白這是如何避免從本地堆棧(其中Material()正在構建中)複製到堆(make_shared實際上放好它)。在這種情況下,如何避免複製? – Mordachai 2013-02-11 21:06:21

1

您可以創建一個「輸入結構」與所有相關的成員。
用正確的值填充它,並將其作爲唯一參數調用構造函數。

+0

也是一個好主意,但我想避免多餘的「隨機」結構這樣的事情:-)。 – Robinson 2012-04-04 13:58:29