假设你想在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_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...>();
}
GCC抱怨错误:在倒数第二行调用'count_int()'时没有匹配函数。为什么以及如何解决这个问题? 感谢。
答案 0 :(得分:3)
这works:
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...>();
};
答案 1 :(得分:1)
它失败是因为你没有参数包不包含任何值的基本情况 - 因为你之前使用的count_int()基本情况不是模板化的,因此无法用<Tn...>
调用,即使Tn
是空的。这就是它失败的原因。至于如何修复它,我不知道。
答案 2 :(得分:1)
这是因为停止条件不是函数模板,因此当您使用空count_int<Tn...>();
调用Tn
时,找不到非模板化函数。
如果您尝试将停止条件更改为模板:
template <typename...>
size_t count_int() { return 0; }
你会收到一个错误,因为当你做在参数包中有参数时,你正在调用哪个函数是不明确的。
您可以通过将调用转发为模板类来解决此问题,并完全避免递归。以下内容应该有效(尽管我还没有成功)
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;
}