stl容器使用的iterator幾乎都是智慧型指標,所以才能以++操作在節點之間移動。
但真正的指標,支援隱式型別轉換:
1> 指向「派生類物件」的指標可以轉成指向「基類物件」的指標;
2> 指向「non-const物件」的指標可以轉成指向「const物件」的指標;
智慧型指標做不到這些。
templateclass smartptr ; class top ; }; class middle: public top ; }; class bottom: public middle ; }; smartptrpt1 = smartptr(new middle); smartptrpt2 = smartptr(new bottom); smartptrpct2 = pt1;
上面的那三個型別轉換是通過不了編譯的。對於例項化的模板物件來說,它們之間的繼承關係全部作廢。
為了實現型別轉換,要使用「成員函式模板」(member function template),豐富一下smartptr的實現才行:
templateclass smartptr t* get() const smartptr(const smartptr& other); // 1. 這才是一般意義上的copy ctor private: t *heldptr; };
該建構函式不宣告為explicit是為了支援隱式型別轉換。
成員函式模板
1 背景 參考資料 1 p218的條款45 運用成員函式模板接受所有相容型別,提出了如何使得自定義的智慧型指標支援隱式型別轉換的方法,其中用到的技巧就是使用成員函式模板。關於其詳細的原理,書中已經說的很清楚,只是在程式設計的過程中會遇到挫折,故在此記錄一下成功通過的編譯的 見下一章 2 templa...
成員函式模板
真實指標支援隱式轉換 1 derived class指標可以隱式轉換為base class指標 2 指向non const物件 的指標可以轉換成 指向const物件 的指標。智慧型指標 必須編寫乙個成員函式模板。因為我們無法寫出所有的智慧型指標的建構函式,一旦derived體系有新的補充就又要根據其...
條款45 運用成員函式模板接受所有相容型別
條款44 運用成員函式模板接受所有相容型別 use member function templates to accept all compatible types.內容 不知道大家注意到沒有,在類的繼承體系中,物件指標一直在為我們做一件很好的事情 支援隱式轉換 implicit conversio...