Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 来自模板参数的扩展参数包(值)_C++_Variadic Templates - Fatal编程技术网

C++ 来自模板参数的扩展参数包(值)

C++ 来自模板参数的扩展参数包(值),c++,variadic-templates,C++,Variadic Templates,尝试使用递归的常规方法扩展包时出现了一个错误: template<bool first> int func1(int value = 0) { return some_func(first, value); } template<bool first, bool... args> int func1(int value = 0) { return func1<args...>(some_func(first, value) ); } 模板i

尝试使用递归的常规方法扩展包时出现了一个错误:

template<bool first> int func1(int value = 0) {
    return some_func(first, value);
}

template<bool first, bool... args> int func1(int value = 0) {
    return func1<args...>(some_func(first, value) );
}
模板int func1(int值=0){
返回一些函数(第一个值);
}
模板int func1(int值=0){
返回func1(某些函数(第一个值));
}
在编译时递归的最后一步,func1的调用是不明确的, 很明显,第一个候选者是第一个函数,在我的例子中是一些具体的专门化:

int func1(int)[带bool first=false]

但第二个是

int func1(int)[带bool first=false;bool…args={}]

您可以看到,这也是正确的—第一个参数之后是一组空参数。 有没有办法防止这种情况


感谢您

通过添加一个显式的
第二个
参数,从递归案例中消除基本案例的歧义:

template<bool first> int func1(int value = 0) {
    return some_func(first, value);
}

template<bool first, bool second, bool... args> int func1(int value = 0) {
    return func1<second, args...>(some_func(first, value) );
}
模板int func1(int值=0){
返回一些函数(第一个值);
}
模板int func1(int值=0){
返回func1(某些函数(第一个值));
}

所以最后,我没有使用递归,而是使用下面唯一的代码

(实际上std::array不是必需的,但在我看来更有用, 扩展也可以使用类似C的数组进行归档)

template unsigned long func1(){
数组ar{args…};
//为我的任务而写的文章
std::位集b;
对于(std::size_t i=0;i
似乎可以使用constexpr将此构造简化为一个函数,如果
template <bool... args> unsigned long func1() {
    std::array<bool, sizeof...(args)> ar{args...};

    // the piece specific for my task
    std::bitset<sizeof...(args)> bs;
    for(std::size_t i = 0; i < ar.size(); ++i) {
        bs[i] = ar[i];
    }

   // ... processing ... 
    return bs.to_ulong();
}