可变参数模板(带有类和功能)不符合

时间:2019-07-16 06:51:13

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

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

#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;
}

有人可以解释这个问题吗?预先感谢。

1 个答案:

答案 0 :(得分:3)

只需将参数包直接扩展到向量中

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...);
}