item41:了解隱式介面和編譯期多型、
縱使你從未使用過templates,應該不陌生「執行期多型」和「編譯期多型」之間的差異。因為它類似於「哪乙個過載函式該被呼叫(發生在編譯期)」和「哪乙個virtual函式應該被繫結(發生在執行期)」之間的差異。
加諸於template引數身上的隱式介面,就像加諸於class物件身上的顯式介面一樣真實,而且兩者都在編譯期完成檢查,就像你無法以一種「與class提供之顯式介面矛盾」的方式來使用物件(**將不會通過編譯)。你也無法在template中使用「不支援template所要求之隱式介面」的物件(**一樣不能通過編譯)。
item42:了解typename的雙重意義
template
void print2d(const c&container)//列印容器內的第二個元素
{ if(container.size()>=2){
c::const_iterator iter(container.begin());
++iter;
int value=*iter;
std::cout
巢狀從屬名稱有可能導致解析困難,在我們知道c是什麼之前,沒有任何辦法可以知道c::const_iterator是否為乙個型別,而當編譯期開始解析template print2d時尚未確定c是神惡魔東西,c++有個規則可以解析這一狀態。
如果解析器在template中遭遇乙個巢狀從屬名稱,它便假設這個名稱不是個型別,除非你告訴它是(用typename)。
一般性規則很簡單:任何時候當你想要在template中指涉乙個巢狀從屬型別名稱,就必須在使用它的前乙個位置上放上關鍵字typename。
有乙個例外:「typename必須作為巢狀從屬型別名稱的字首詞」,這一規則的例外是,typename不可能出現在base classes list內的巢狀從屬型別名稱之前,也不可能在member initialization list(成員初始化列表)中作為base class的修飾符。
總結:①申明template引數時,字首關鍵字clas和typename可以互換。
②請使用關鍵字typename來標誌巢狀從屬型別名稱:但不能在base class lists(基類列表)或member initialization list內以它作為base class的修飾符。
item44:將引數無關的**抽離templates
總結:①template生成多個classes和多個函式,所以任何template**都不該與某個造成膨脹的template引數產生依賴關係。
②因非型別模版引數而造成的**膨脹,往往可以消除,做法是以函式引數或class成員變數替換template引數。
③因型別引數而造成的**膨脹,往往可以降低,做法是讓帶有完全相同二進位制長度的具現型別共享實現**。
item45:運用成員函式模版接受所有相容型別
總結:請使用member function template(成員函式模版)生成「可接受所有相容型別」的函式。
如果你宣告member template用於「泛化copy構造」或「泛化assignment操作」,你還是需要宣告正常的copy建構函式和copy assignment操作符。
item46:需要型別轉換時要將模版定義為非成員函式
總結:當我們編寫乙個class template,而它所提供之「於此template相關的」函式支援「所有引數之隱式型別轉換」時,請將那些函式定義為「class template 內部的friend函式」。
item47:請使用traits classes表現型別資訊
這一小結可以參考我的另一篇總結。
Effective C (七)模板與泛型程式設計
七 模板與泛型程式設計 條款41 了解隱式介面和編譯器多型 1 物件導向 1 顯式介面 型別必須支援class的介面,在原始碼中明確可見。基於函式簽名式 2 執行期多型 對於某些virtual成員函式,執行時根據動態型別決定呼叫哪個函式 2 template及泛型程式設計 1 隱式介面 型別支援的介...
C 16章 模版與泛型程式設計
template 模版引數列表,用逗號分割多個模版引數,且模板引數列表不可能空。引用避免了引數賦值 int compare const t v1 const t v2 template 模版引數列表,用逗號分割多個模版引數 int compare const char v1 u const char...
C 泛型程式設計 五 模版過載與特例化
前文回顧 c 泛型程式設計 一 基本概念 c 泛型程式設計 二 函式模版 c 泛型程式設計 三 模版實參推斷 c 泛型程式設計 四 類模板 函式模版可以被另乙個模版或者乙個普通非模版函式重做 名字相同的函式必須具有不同數量或者型別的引數。根據引數推斷只有乙個版本是可行的,則選擇該版本 都是可行的,匹...