2012-02-18 32 views
0

我想確定一個序列的大小。對於STL中的所有序列,我可以使用.size()成員函數,但如果序列是一個數組,我會遇到麻煩。我如何以編程方式確定作爲參數傳遞的序列是數組類型還是STL序列類型。使用通用接口找到序列的大小

例如

template<typename sequence> 
size_t find_size(sequence& s) 
{ 
// if s has .size() member function 
// return s.size() 
//else if it is an array type 
// return sizeof(s) 
//else throw error 
} 

基本上我尋找在C++ 11

PS非成員尺寸功能,正如我們有非會員begin()和結束():由序列我指的是序列在STL中定義(它們都有.size()成員函數),包括數組作爲參數。

回答

3

您可以通過爲數組重載您的find_size函數來做到這一點。

// This overload expects an array to be passed by reference. 
template<typename T, size_t N> 
size_t find_size(T (&)[N]) { 
    return N; 
} 

// This overload takes any other type that supports T::size(). 
template<typename T> 
size_t find_size(T c) { 
    return c.size(); 
} 

請注意,這對於降級爲指針的數組無效。另外,我總是建議在C風格的數組上使用std::array,除非你使用C庫。

+0

實際上,我想擁有這樣一個接口,以便它獨立於任何序列類型。 – 2012-02-19 00:27:49

+0

我不確定你在問什麼。你只想使用一個函數而不是兩個來獲得相同的結果? – 2012-02-19 00:28:43

+0

重載函數也很好。 – 2012-02-19 00:33:08

1

,你可以使用的東西如下:

template<typename T> 
size_t find_size(const T& c) 
{ 
    return distance(begin(c), end(c)); 
} 

雖然我並不認爲這是在任何方面有效。獲取序列的大小並不依賴於該序列(例如,查找鏈接列表的大小與查找矢量的大小根本不同),並且它會更有效,因爲通過爲每個鏈接提供重載提示dauphic沒有實現的特定類型的序列.size

1

你沒有詳細解釋過什麼是(和不是什麼)序列,但是如果它在概念和執行上與Boost.Range類似,那麼boost::size可能是對你感興趣。