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