2011-05-25 55 views
5

我一直在試圖通過Boost type-traits頭文件,現在感覺很不舒服,因爲無數#define提供了強烈的不可讀性。然後更多#define。Boost type_traits is_array

具體而言,我有興趣弄清楚以下三個特徵:如果類型T是數組,類或枚舉。

任何人都可以幫助建議某種方式來破譯明顯的瘋狂背後的方法嗎?怎麼樣,你從一個類型,任何相關的閱讀材料等弄清楚特質背後的理論

+0

擺脫無數煩擾你的ifdefs的一種方法是通過預處理器運行代碼,即在'gcc'中使用'-E'選項。然後,您可以查看編譯器爲您的平臺編譯的代碼。一般來說,特徵是使用SFINAE,模板(部分)特化和編譯器特定的擴展來實現的。 – 2011-05-25 17:59:43

+0

+1爲你的勇氣潛入升壓頭。 ;)我實際上只能推薦,特別是Boost.Function標題,對我來說頗具教育意義。 – Xeo 2011-05-25 18:08:42

回答

4

is_array是非常簡單和直接的:

template<class T> 
struct is_array{ 
    static const bool value = false; 
}; 

template<class T, std::size_t N> 
struct is_array< T (&)[N] >{ 
    static const bool value = true; 
}; 

只是一個簡單的偏特上引用TO-數組類型。

is_class更復雜一點,它依賴於重載解析和類和結構具有構造函數(或析構函數)的事實。正如我目前在我的iPod Touch上,我無法真正展示一個例子。一旦我再次訪問PC,我將編輯一個。

is_enum依靠編譯器內在函數我相信,所以沒有例子。

注意:這裏的一切都來自內存,我可能是錯誤的枚舉之一。

+0

你對'is_enum'說得對,'is_pod'也是如此。 – ildjarn 2011-05-25 18:31:52

+0

@ildjarn:我相信在Visual C++中,就我所見,每種類型特徵都是使用編譯器內部函數/擴展實現的。畢竟,編譯器最瞭解類型,不是嗎? ':)' – Xeo 2011-05-25 22:02:25

+0

@Xeo:我的意思是說,特別是這兩種類型的特徵只能使用編譯器內在函數來實現,而其餘特性可以用簡單的元函數來實現。 – ildjarn 2011-05-25 22:04:26

相關問題