可变参数模板(带有类和函数)无法编译

Posted

技术标签:

【中文标题】可变参数模板(带有类和函数)无法编译【英文标题】: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;

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

【问题讨论】:

【参考方案1】:

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

static std::vector<int> __GetParam()

    std::vector<int> vecParam...;
    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...);

【讨论】:

哦,这就是我想要的。谢谢。

以上是关于可变参数模板(带有类和函数)无法编译的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能将模板函数指针传递给可变参数函数?

C++11 中的非类型可变参数函数模板

编译器跳过 C++ 中的可变参数模板/函数 [关闭]

如何将元组扩展为可变参数模板函数的参数?

第20课 可变参数模板_模板参数包和函数参数包

如何通过可变参数模板将多个构造函数参数转发到数组初始值设定项列表?