C 模板與泛型程式設計

2021-09-27 13:20:20 字數 1001 閱讀 9589

1、物件導向程式設計總是以顯式介面和執行時多型解決問題。模板及泛型世界不同,在此世界中顯式介面和執行時多型仍然存在,但重要性降低,反倒是隱式介面和編譯器多型移到前頭。

執行時多型和編譯時多型:前者表示哪乙個虛函式該被繫結,後者表示哪乙個過載函式該被呼叫。

顯式介面由函式的簽名式(函式名稱、引數型別、返回型別)構成,隱式介面並不基於簽名式,而是由有效表示式組成。

2、了解typename 的雙重意義:

templateclass widget   使用class 

templateclass widget  使用typename

上面兩個沒有什麼不同,然而c++並不總是把class和typename視為等價。

c++有個規則:如果解析器在template中遭遇乙個巢狀從屬名稱,它便假設這名稱不是個型別,除非你告訴它是。

一般性規則很簡單:任何時候當你想要在template中指涉乙個巢狀從屬型別名稱,就必須在緊鄰它的前乙個位置放上關鍵字typename。

注意:「typename必須作為巢狀從屬型別名稱的字首詞」的例外是,typename不可以出現在base class list內的巢狀從屬名稱型別前,也不可以出現在member initialization list (成員初始列)中作為base class修飾符。

3、模板全特化「template <>」 象徵這既不是template也不是標準class,也就是說一旦型別引數被定義,再也沒有其他template引數可供變化。

注意:當繼承msgsender,但其中的company是個template引數,不到後來我們無法確切知道他是什麼。而如果不知道company是什麼,就無法知道class msgsender看起來像什麼———更明確的說是沒辦法知道他是否有個sendclear函式。

有三個解決辦法:

第一是在base class 函式呼叫動作之前加上this->

第二是使用using 宣告式

第三是明白指出被呼叫函式位於base class內

4、將與引數無關的**抽離template,

模板與泛型程式設計

模板是泛型變成的基礎。泛型程式設計 編譯與型別無關的 是一種復用的方式,模板分為模板函式和模板類。模板函式是乙個通用的函式模板,而不是為每一種型別定義乙個新函式,乙個函式模板就像乙個公式,針對不同型別函式生成不同的函式版本。關鍵字 template 以 template 開始,後面跟乙個模板引數列表...

模板與泛型程式設計

泛型程式設計 編寫與型別無關的通用 是 復用的一種手段。模板是泛型程式設計的基礎。函式模板代表了乙個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。模板的格式 template 返回值型別 函式名 引數列表 模板分為類模板和函式模板 模板它本身並不是函式,是編譯...

模板與泛型程式設計

一 函式模板 模板定義以關鍵字template開始,後跟乙個模板引數列表,在模板定義中,模板引數列表不能為空。模板型別引數 型別引數前必須使用class或typename關鍵字。非型別模板引數 表示乙個值而不是乙個型別 陣列引用形參 arr兩端的括號必不可少 void print int arr 1...