我想在一个类中有一个可变参数模板函数。可变参数模板参数是应该以类似循环的方式处理的字符。所以我想像在haskell中那样编写它,头/尾拆分列表,直到达到基本情况(空列表)。
作为一个例子,让我们只计算给定参数的数量(只是一个最小的例子)。
我想出了以下代码:
struct MyClass {
template<char ...X>
static int count();
};
template<>
int MyClass::count<>() {
return 0;
}
template<char Head, char ...Tail>
int MyClass::count<Head, Tail...>() {
return 1 + count<Tail...>();
}
但是,这似乎不起作用:
prog.cpp:12:35: error: function template partial specialization ‘count<Head, Tail ...>’ is not allowed
prog.cpp:12:5: error: prototype for ‘int MyClass::count()’ does not match any in class ‘MyClass’
prog.cpp:3:16: error: candidate is: template<char ...X> static int MyClass::count()
我怎样才能做到这一点?我知道函数不支持部分专业化。但我认为将可变参数模板专门化为头/尾和空基本案例版本不是部分专业化而是完全专业化,但也许我错了?我需要把它写成一个类而不是一个函数吗?
我找到了实现基本案例而不使用模板语法的示例(printf)。但我想我的情况不同,因为对 printf 的调用不使用模板语法而是类型 deduction,所以printf(tail...)
调用printf()
iftail
为空。另一方面,就我而言,在调用基本情况时,count<>()
与count()
.