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