std::make_shared构造函数参数数量

11

在 Visual Studio 2010/2011 中依然没有可变参数模板(variadic templates),这就导致了一个接受大量参数的构造函数可能会存在问题。例如,下面的代码将无法通过编译:

    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。显然的解决方法是分两部分构造,但我希望避免这种情况。除了使用new而不是make_shared,还有其他可能吗?

谢谢。

2个回答

25

您可以构造一个类,然后将其移动到堆分配的值中。

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

好消息是,make_shared 在创建 shared_ptr 时也会使用优化的单一分配例程。 - Alex Z
1
抱歉 - 我不明白这如何避免从本地堆栈(Material()正在构建的地方)复制到堆(make_shared实际放置它的地方)。在这种情况下,如何可能避免复制? - Mordachai

1
你可以创建一个包含所有相关成员的“输入结构体”。 将其填充为正确的值,并使用该结构体作为唯一参数调用构造函数。

也是一个好主意,但我想避免像这样的“随机”结构体。 :-) - Robinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接