Effective C++ --7 模板与泛型编程
上一篇Effective C++ -- 6 繼承與面向對象設計
?
41、了解隱式接口和編譯器多態
?(1)class和template都支持接口和多態。Class支持顯示接口,多態是指virtual引起的運行期多態;而template支持隱式接口和編譯器多態。
?(2)編譯器多態是指以不同的template參數具現化function templates會導致調用不同的函數。隱式接口是指template中執行于類型對象身上的操作來決定的。
?(3)顯示接口由函數的簽名式(函數名、參數類型、返回類型)構成,隱式接口不基于函數簽名式,而是由有效表達式組成。
42、了解typename的雙重含義
?(1)聲明template參數時,class和typename可互換。
?(2)使用typename關鍵字標識嵌套從屬類型名稱。Template內體現的名稱如果相依于某個template參數,稱之為從屬名稱,如果從屬名稱在class內呈嵌套狀,稱之為嵌套從屬名。但是不得在base class lists(基類列)或者member initialization list(成員初始列表)內以它作為base class修飾符。
43、學習處理模板化基類內的名稱
?(1)derived class template 往往拒絕調用base class template的函數,因為base class template有可能被特化,而那個特化版本可能不提供和一般性template相同的接口,因此它往往拒絕在templatized base class內尋找繼承而來的名稱。
?(2)解決上述問題的方法:可在derived class template內通過“this->”指涉base class template內的成員名稱,或籍由一個明白寫出base class 資格修飾符完成(using聲明式或用base::明確指出調用函數位于base class中)。
44、將與參數無關的代碼抽離templates
?(1)template 生成多個class和函數,所以任何template代碼都不該與某個構成膨脹的template參數產生相依關系。
?(2)因非類型模板參數而造成的代碼膨脹,往往可以消除,做法是以函數參數或者class成員變量代替template參數。
?(3)因類型而造成的代碼膨脹,往往可以降低,做法是讓帶有完全相同二進制表述的具現類型共享實現碼。
45、運用成員函數模板接受所有兼容類型
?(1)真實指針支持隱式轉換,derived指針可以隱式轉換為base指針,但是template不同,以帶有base-derived的關系的兩個類型分別具化某個template,產出來的兩個具現體并不帶有此種關系。
?(2)使用member function templates(成員函數模板)生成“可接受所有兼容類型”的函數。
?(3)如果聲明member template用于泛化copy構造或泛化assignment操作,還需要聲明正常的copy構造函數和copy assignment操作符。
46、需要類型轉換時請為模板定義非成員函數
?(1)template實參推導過程中從不將隱式類型轉換函數納入考慮,這樣的轉換在函數調用過程中確實被使用,但是能夠調用一個函數之前,首先必須知道這個函數存在,為了知道它,必須先為相關的function template推導出參數類型,然后才能將適當的函數具現化出來。然而template實參推導過程中并不考慮采納“通過構造函數而發生的”隱式類型轉換。
?(2)當編寫一個class template,而它所提供之“與此template相關的”函數支持“所有參數之隱式類型轉換”時,將那些函數定義為“class template內部的friend函數”。原因:為了讓類型轉換可能發生于所有實參身上,需要non-member函數;為了令函數被自動具現化,需要將它聲明在class內部;在class內部聲明non-member函數的唯一方法是令它成為friend。
47、請使用traits classes表現類型信息
?(1)traits classes 使得“類型相關信息”在編譯期可用,它們以template和template特化完成。不要將能在編譯期進行的留到運行期,選擇重載而不是判斷語句。
?(2)整合重載技術后,traits classes有可能在編譯器對類型執行if…else測試。
48、認識template元編程
?(1)template metaprogramming(TMP,模板元編程)是編寫template-based C++程序并執行于編譯器的過程。47的trait解法就是TMP。
?(2)TMP可將工作由運行期移往編譯器,因而得以實現早期錯誤偵測和更高的執行效率。TMP同時使程序有較小的可執行文件、較短的運行期、較少的內存需求。
?(3)TMP可被用來生產“基于政策選擇組合”的客戶制定代碼,也可用于避免生成對某些特殊類型并不適合的代碼。
總結
以上是生活随笔為你收集整理的Effective C++ --7 模板与泛型编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Effective C++ --6 继承
- 下一篇: Effective C++ --8 定制