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