【问题标题】:variadic template (with class and funtion) fails to complie可变参数模板(带有类和函数)无法编译
【发布时间】:2019-07-16 06:51:13
【问题描述】:

我需要实现一个自注册功能,我想获取参数。好的,我的描述不清楚,这是我的代码。

#include <vector>

template<typename T, int... Param>
class Demo
{
public:
    static std::vector<int> __GetParam()
    {
        std::vector<int> vec;
        Push(vec, Param);
        return vec;
    }

private:
    static void Push(std::vector<int>& vec, int v)
    {
        vec.emplace_back(v);
    }

    template<int... Rest>
    static void Push(std::vector<int>& vec, int v, Rest... rest) // error here
    {
        vec.emplace_back(v);
        Push(vec, rest...);
    }
};

int main()
{
    auto vec = Demo<char, 1, 2, 3, 4>::__GetParam();
    return 0;
}

谁能解释一下这个问题?提前致谢。

【问题讨论】:

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


    【解决方案1】:

    直接把参数包展开成向量就行了

    static std::vector<int> __GetParam()
    {
        std::vector<int> vec{Param...};
        return vec;
    }
    

    如果你想保持你最初的想法,你需要用包的每个参数调用 Push。一种方法是Variadic template initilizer_list trick

        auto l = {(Push(vec, Param),0)...};
    

    然后,你只需要修复剩下的代码

    static void Push(std::vector<int>& vec, int v)
    {
        vec.push_back(v);
    }
    
    template<int... Rest>
    static void Push(std::vector<int>& vec, int v) // error here
    {
        vec.push_back(v);
        Push(vec, Rest...);
    }
    

    【讨论】:

    • 哦,这就是我想要的。谢谢。
    猜你喜欢
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    相关资源
    最近更新 更多