2011-02-23 179 views
5

讓我們假設你想這樣做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抱怨錯誤。爲什麼以及如何解決這個問題? 謝謝。

回答

1

它失敗了,因爲當參數包不包含值時沒有基本情況 - 因爲之前使用的count_int()基本情況不是模板化的,因此即使Tn爲空時也不能用<Tn...>調用。這就是它失敗的原因。至於如何修復,我沒有什麼想法。

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

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