可变参数函数(不带参数!)

问题描述:

让我们假设你想这样做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...); 
} 

不错,但感觉没有必要绕过参数。不幸的是,这并不工作:在未来到最后一行的调用没有匹配的函数“count_int()”:

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()基本情况不是模板化的,因此即使Tn为空时也不能用<Tn...>调用。这就是它失败的原因。至于如何修复,我没有什么想法。

这是因为停止条件不是函数模板,所以当您调用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; 
} 

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

谢谢!这工作正常。 – Hans 2011-02-23 13:49:58