Reference Type 和 Pointer Type
所謂左值(lValue):是用來代表某個對象的一個東西。如果p是指向類型為T的某個對象,那么表達式*p不能只是返回類型為T的對象,而必須是返回一個lValue(左值)。
平時總是拿起*p就直接賦值(對于簡單基本類型,例如int *p = &I ; *p=3),沒想什么*p返回左值那么多。但是當在自定義類中重栽*運算符的時候,我們就要特別小心,要注意到這點,返回為T& 才對。
言規正傳
iterator_traits的某些機制所蘊涵的意義十分微妙而深遠,不過它的實現卻不是很復雜,不過這些東西看起來比較容易看懂,真正能夠靈活使用就需要花時間領悟了,為什么會采取這種方法解決問題,和其它的方法對比有什么好處和提高?這種明白這些問題才算掌握了trait的實質。
template< class Iterator>
struct iterator_traits
{
typedef typename Iterator::iterator_category iterator_category;
typedef typename Iterator::value_type value_type;
typedef typename Iterator::difference_type difference_type;
typedef typename Iterator::pointer pointer;
typedef typename Iterator::reference reference ;
};
template< class T>
struct iterator_traits
{
typedef random_access_iterator_tag iterator_category;
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef T& reference ;
};
template< class T>
struct iterator_traits
{
typedef random_access_iterator_tag iterator_category;
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef T& reference ;
};
當你定義一個自己的算法,你需要關注這個機制,下面兩個理由就是你可能要用到iterator_traits:
① 你必須返回某值,或者是申明臨時變量,而其它型別與iterator的value type 或者different type或者reference type 或者pointer type一致。
② 你的算法類似與advance,必須根據iterator的分類來決定不同的實現方法(提高效率,在編譯時候進行判斷而不是在運行的時候進行判斷),沒有traits機制,你只好在‘一般化但是沒效率’或者‘有效率但是過度狹隘’中進行抉擇。
當定義一個Iterator 類,就得在改類中定義五個嵌套的類型,如上面的五個所示。要不然就得針對你的Iterator類,明白的令iterator_traits為Iterator特化,就像iterator_traits要明白的針對指針而特化一樣。第一種做法總是比較簡單,尤其是STL的一個輔助類,base class iterator,讓事情變得更簡單了。
template< class Category,
class Value,
class Distance =ptrdiff_t,
class Pointer = Value*,
class Reference = Value &
>
struct iterator
{
typedef Category iterator_category;
typedef Value value_type;
typedef Distance difference_type;
typedef Pointer pointer;
typedef Reference reference;
};
為了確保iterator_traits能夠對新的iterator class有適當的定義,最簡單的方法就是從iterator類派生自己的iterator?;?/span>iterator不含任何成員函數和成員變量,所以繼承不存在額外的開銷。
posted on 2008-01-13 11:34
小果子 閱讀(1933)
評論(1) 編輯 收藏 引用 所屬分類:
學習筆記