变量函数(没有参数!)

时间:2011-02-23 12:58:07

标签: 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_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()'时没有匹配函数。为什么以及如何解决这个问题? 感谢。

3 个答案:

答案 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;
}
相关问题