Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
Templates 可变函数(无参数!)_Templates_C++11 - Fatal编程技术网

Templates 可变函数(无参数!)

Templates 可变函数(无参数!),templates,c++11,Templates,C++11,假设您希望在C++0x中执行此操作: size_t count_int() { return 0; } template<typename T, typename... Tn> size_t count_int(T a0, Tn... an) { size_t n = is_integer<T>::value ? 1 : 0; return n + count_int(an...); } size\u t count\u int(){return 0;}

假设您希望在C++0x中执行此操作:

size_t count_int() { return 0; }
template<typename T, typename... Tn>
size_t count_int(T a0, Tn... an) {
    size_t n = is_integer<T>::value ? 1 : 0;
    return n + count_int(an...);
}
size\u t count\u int(){return 0;}
模板
尺寸计数(t a0,Tn…an){
size\u t n=is\u integer::value?1:0;
返回n+count\u int(an…);
}
很好,但是我觉得没有必要转述这些论点。不幸的是,这不起作用:

size_t count_int() { return 0; }
template<typename T, typename... Tn>
size_t count_int() {
    size_t n = is_integer<T>::value ? 1 : 0;
    return n + count_int<Tn...>();
}
size\u t count\u int(){return 0;}
模板
大小\u t计数\u int(){
size\u t n=is\u integer::value?1:0;
返回n+count_int();
}
GCC抱怨错误:在下一行的“count_int()”调用中没有匹配的函数。为什么以及如何解决这一问题?
谢谢。

它失败了,因为当参数包不包含值时,您没有基本大小写-因为您前面使用的count_int()基本大小写没有模板化,因此无法使用
调用,即使
Tn
为空。这就是它失败的原因。至于如何修复它,我几乎不知道。

这是因为停止条件不是函数模板,所以当调用
count_int()时为空
Tn
未找到非模板函数

如果尝试将停止条件更改为模板:

template <typename...>
size_t count_int() { return 0; }
模板
size\u t count\u int(){return 0;}
您将得到一个错误,因为当您在参数包中有参数时,调用哪个函数是不明确的

您可以通过转发对模板类的调用来解决这个问题,并完全避免递归。像下面这样的东西应该可以工作(尽管我还没有成功做到)

模板
结构内部计数器{
枚举{value=is_整型::value+int_计数器::value;}
};
模板
结构内部计数器{
枚举{value=0;}
};
模板
大小\u t计数\u int(){
返回int_计数器::值;
}
这是:

模板
大小\u t计数\u int()
{
返回为_integer::value?1:0;
}
模板
大小\u t计数\u int(){
size\u t n=is\u integer::value?1:0;
返回n+count_int();
};
template <typename T, typename... Tn>
struct int_counter {
    enum { value = is_integer<T>::value + int_counter<Tn...>::value; }
};

template <>
struct int_counter<> {
    enum { value = 0; }
};

template <typename... Tn>
size_t count_int() { 
    return int_counter<Tn>::value;
}
template <typename T>
size_t count_int()
{
   return is_integer<T>::value ? 1 : 0;
}

template<typename T, typename T1, typename... Tn>
size_t count_int() {
    size_t n = is_integer<T>::value ? 1 : 0;
    return n + count_int<T1,Tn...>();
};