《Effective C 》模版與泛型程式設計

2022-07-29 12:27:10 字數 1950 閱讀 5908

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 泛型程式設計 四 類模板 函式模版可以被另乙個模版或者乙個普通非模版函式重做 名字相同的函式必須具有不同數量或者型別的引數。根據引數推斷只有乙個版本是可行的,則選擇該版本 都是可行的,匹...