【问题标题】:std::make_shared number of parameters in the constructorstd::make_shared 构造函数中的参数数量
【发布时间】:2012-04-04 13:41:50
【问题描述】:

在 Visual Studio 2010/2011 中没有可变参数模板(仍然!)的情况下,采用大量参数的构造函数可能会出现问题。例如以下将无法编译:

    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 之外,这里还有其他可能吗?

谢谢。

【问题讨论】:

    标签: c++ stl make-shared


    【解决方案1】:

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

    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时也会使用优化的一次分配例程
    • 抱歉 - 我不明白这如何避免从本地堆栈(正在构造 Material() 的地方)复制到堆(make_shared 实际放置它的地方)。在这种情况下,如何避免复制?
    【解决方案2】:

    您可以创建一个包含所有相关成员的“输入结构”。
    用正确的值填充它并使用它作为他唯一的参数调用构造函数。

    【讨论】:

    • 也是一个好主意,但我想避免像这样的事情使用无关的“随机”结构:-)。
    猜你喜欢
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2013-10-29
    相关资源
    最近更新 更多