2009-10-22 32 views
2

我剛剛遇到std :: tr1 :: extent模板,它讓我感到困惑。我從來沒有處理過我的生活中的數組類型參數,所以我不明白它們是如何工作的。因此,考慮到從GCC type_traits編譯器如何選擇具有數組特徵的模板特性?

template<typename _Tp, unsigned _Uint, std::size_t _Size> 
    struct extent<_Tp[_Size], _Uint> 

template<typename _Tp, unsigned _Uint> 
    struct extent<_Tp[], _Uint> 

代碼沒有編譯器的專業化之間如何選擇?我應該輸入extent以選擇第二個類型?

回答

6
extent<int[], 0>::value == 0 // second one chosen 

int[]是一個不完整的類型,編譯器不知道它的價值sizeof。最外層的維度可能會保持不完整,因爲對於數組在大多數上下文中正常工作並不重要(特別是索引仍然可以工作)。像int[1][]這樣的東西不再是正確的類型了。

extent<int[2], 0>::value == 2 // first one chosen 

當然這可以嵌套:

extent<int[][2], 0>::value == 0 // second one chosen, with `_Tp` being `int[2]` 
extent<int[][2], 1>::value == 2 // second one chosen again 
+0

所以第二個將被選擇的任何時間有一個在聲明空的方括號([])? – vava 2009-10-22 10:49:08

+0

是的,確實如此。這是因爲T []與T [N]不匹配。 – 2009-10-22 10:55:12

+0

Hm,看上去儘管有邏輯,當'extent <_Tp [_Size],_UInt>'匹配'extent '時,'_Tp'獲得'int [2]'而不是'int [1]'。但'(int [1])[2]'似乎更直觀...... – vava 2009-10-22 11:08:06