【问题标题】:Create a different Parameter Pack from a Parameter Pack从参数包创建不同的参数包
【发布时间】:2017-11-06 23:43:40
【问题描述】:

我不确定我真正想要做什么,所以如果标题不合适,请原谅。

我有一个带有模板参数包的类模板。我希望构造函数根据参数包中的类型来期望类型,更具体地说,我想将每个参数包元素传递给另一个类模板(采用一个参数)来构造构造函数参数。

这就是我开始的结构:

template<class ElementType>
struct ElementPreset{
//... stores a preset for an element of ElementType
};

template<class... Elements>
class WidgetPreset{
    WidgetPreset(ElementPreset<Elements...> pPresets)
        :presets(pPresets){}

    std::tuple<ElementPreset<Elements...>> presets;
}

上面的代码不起作用,但我想做的是从Elements 创建一个新的参数包,其中每个元素都是ElementPreset&lt;Element&gt; 而不是Element

C++ 中是否对此有任何语言支持?

【问题讨论】:

    标签: c++ c++11 templates parameters variadic-templates


    【解决方案1】:

    也许

    template <typename ... Elements>
    struct WidgetPreset{
        WidgetPreset(ElementPreset<Elements> ... pPresets)
            :presets(pPresets...){}
    
        std::tuple<ElementPreset<Elements>...> presets;
    };
    

    我是说……

    (1) 创建class 时,如果没有定义publicprotected,则全部为private;所以你的class 构造是private

    (2) ElementPreset&lt;Elements...&gt; pPresets 错误:ElementPreset 只接收一个类型;你必须在类型后解包:ElementPreset&lt;Elements&gt; ... pPresets

    (3) 元组有同样的问题:std::tuple&lt;ElementPreset&lt;Elements&gt;...&gt;,而不是std::tuple&lt;ElementPreset&lt;Elements...&gt;&gt;

    (4) 当你初始化preset 时,你必须展开包:presets(pPresets...)(或presets{pPresets...}),而不是presets(pPresets)

    (5) 记住struct(或class)末尾的;

    【讨论】:

    • 不是it does work,我只是在编译时搞砸了。
    • @Justin - 发生的事情。
    猜你喜欢
    • 2018-09-05
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    相关资源
    最近更新 更多