模型與泛型編程
- 條款 41 - 了解隱式接口和編譯期多態(tài)
- classes 和 templates 都支持 Interfaces 和多態(tài)。
- 對 classes 而言接口是顯式的,以函數(shù)簽名為中心,多態(tài)則是通過 virtual 函數(shù)發(fā)生于運(yùn)行期。
- 對 template 參數(shù)而言接口是隱式的,奠基于有效表達(dá)式。多態(tài)則是通過 template 具現(xiàn)化和函數(shù)重載解析發(fā)生于編譯期。
- 條款 42 - 了解 typename 的雙重意義
- 聲明 template 參數(shù)時,前綴關(guān)鍵字 class 和 typename 可互換
- 請使用關(guān)鍵字 typename 標(biāo)識嵌套從屬類型名稱,但不得在基類列和成員初始列以它作為 base class 修飾符。
- 條款 43 - 學(xué)習(xí)處理模板化基類內(nèi)的名稱
- 可在 derived class templates 通過 this-> 指涉 base class templates 內(nèi)的成員名稱,或借由一個明白寫出的 base class 修飾符完成。
- 條款 44 - 將與參數(shù)無關(guān)的代碼抽離 templates
- Templates 生成多個 classes 和多個函數(shù),所以任何 Template 代碼都不該與某個造成膨脹的 Template 參數(shù)產(chǎn)生相依關(guān)系。
- 因非類型模板參數(shù)而造成的代碼膨脹,往往可以消除,做法是以函數(shù)參數(shù)或者 class 成員變量替換 template 參數(shù)。
- 因類型參數(shù)而造成的代碼膨脹,往往可降低,做法是讓帶有完全相同二進(jìn)制表述的具現(xiàn)類型共享實(shí)現(xiàn)代碼。
- 條款 45 - 運(yùn)用成員函數(shù)模板接受所有兼容類型
- 請使用成員函數(shù)模板生成可接受所有兼容類型的函數(shù)
- 如果你聲明 member templates 用于 “泛化 copy 構(gòu)造” 或者 “泛化 assignment 操作” ,你還是需要聲明正常的的 copy 構(gòu)造 和 copy assignment 操作。
- 條款 46 - 需要類型轉(zhuǎn)換時請為模板定義非成員函數(shù)
- 當(dāng)我們編寫一個 class template , 而它所提供之 “與此 template 相關(guān)” 的函數(shù)支持 “所有參數(shù)之隱式類型轉(zhuǎn)換”時,請將那些函數(shù)定義為 “class template 內(nèi)部的 friend 函數(shù)”
- 條款 47 - 請使用 traits classes 表現(xiàn)類型信息
- Traits class 使得類型相關(guān)信息在編譯期可用,它們使用 template 和 template 特化實(shí)現(xiàn)。
- 整合重載技術(shù)后,Traits classes 有可能在編譯期對類型進(jìn)行 if...else 測試。
- 條款 48 - 認(rèn)識 template 元編程
- TMP,模板元編程可將工作由運(yùn)行期移往編譯期,因而得以實(shí)現(xiàn)早期錯誤偵測和更高的執(zhí)行效率。
- TMP 可被用于生成 “基于政策選擇組合” 的客戶定制代碼,也可用來定制生成對某些特殊類型不合適的代碼