2010-10-20 105 views
56

我正在閱讀Scott Meyers的Effective C++。他正在談論特質類,我知道我需要他們在編譯期間確定對象的類型,但我無法理解他對這些類實際做了什麼的解釋? (從技術角度來看)特質類如何工作?

回答

45

也許你正在期待某種使類型特徵起作用的魔法。在這種情況下,要失望 - 沒有魔法。類型特徵爲手動爲每種類型定義。例如,考慮iterator_traits,它爲迭代器提供類型定義(例如value_type)。

使用它們,你可以寫

iterator_traits<vector<int>::iterator>::value_type x; 
iterator_traits<int*>::value_type y; 
// `x` and `y` have type int. 

但是,爲了使這項工作,居然有一個明確定義某處<iterator>頭,其內容是這樣的:

template <typename T> 
struct iterator_traits<T*> { 
    typedef T value_type; 
    // … 
}; 

這是iterator_traits類型的部分專業化類型的形式T*,即指針一些泛型類型。

同樣,iterator_traits專門用於其他迭代器,例如, typename vector<T>::iterator

+4

+1沒有魔法。儘管不存在一些特性(例如在C++ 0x標準庫中),這些特性不能僅使用語言進行可靠定義,並且編譯器需要特殊的「神奇」幫助才能工作? – UncleBens 2010-10-20 19:48:54

+0

@UncleBens:我不知道C++ 0x定義了哪些特徵,但我確信在C++ 0x之前不存在這樣的特徵。 – 2010-10-20 21:41:02

+2

是不是*現在* ['std :: underlying_type'](http://en.cppreference.com/w/cpp/types/underlying_type)中有一種魔法? – Wolf 2014-06-30 08:50:29

38

性狀類做不是確定對象的類型。相反,它們通常通過在trait中定義typedef或常量來提供關於類型的其他信息。

+5

+1有效結合理論和實施。 – 2013-04-23 07:27:35