我一直在試圖通過Boost type-traits頭文件,現在感覺很不舒服,因爲無數#define提供了強烈的不可讀性。然後更多#define。Boost type_traits is_array
具體而言,我有興趣弄清楚以下三個特徵:如果類型T是數組,類或枚舉。
任何人都可以幫助建議某種方式來破譯明顯的瘋狂背後的方法嗎?怎麼樣,你從一個類型,任何相關的閱讀材料等弄清楚特質背後的理論
我一直在試圖通過Boost type-traits頭文件,現在感覺很不舒服,因爲無數#define提供了強烈的不可讀性。然後更多#define。Boost type_traits is_array
具體而言,我有興趣弄清楚以下三個特徵:如果類型T是數組,類或枚舉。
任何人都可以幫助建議某種方式來破譯明顯的瘋狂背後的方法嗎?怎麼樣,你從一個類型,任何相關的閱讀材料等弄清楚特質背後的理論
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
依靠編譯器內在函數我相信,所以沒有例子。
注意:這裏的一切都來自內存,我可能是錯誤的枚舉之一。
擺脫無數煩擾你的ifdefs的一種方法是通過預處理器運行代碼,即在'gcc'中使用'-E'選項。然後,您可以查看編譯器爲您的平臺編譯的代碼。一般來說,特徵是使用SFINAE,模板(部分)特化和編譯器特定的擴展來實現的。 – 2011-05-25 17:59:43
+1爲你的勇氣潛入升壓頭。 ;)我實際上只能推薦,特別是Boost.Function標題,對我來說頗具教育意義。 – Xeo 2011-05-25 18:08:42