模板偏特化翻譯 09 非類(lèi)型模板參數(shù)、模板的特化、分離編譯
日期:2023-03-11 12:39:36 / 人氣: 534 / 發(fā)布者:成都翻譯公司
浮點(diǎn)數(shù)、類(lèi)對(duì)象以及字符串是不允許作為非類(lèi)型模板參數(shù)的(即只允許整形家族:int、long、longlong、char)非類(lèi)型模板參數(shù)必須在編譯期就能確認(rèn)結(jié)果,因?yàn)榫幾g器在編譯階段需要根據(jù)傳入的非類(lèi)型模板參數(shù)實(shí)例化出對(duì)應(yīng)的類(lèi)或函數(shù)。不支持分離編譯,所有用基于模板算法的實(shí)現(xiàn)必須包含在整個(gè)設(shè)計(jì)的頭文件中。文章目錄
一、非類(lèi)型模板參數(shù)
模板參數(shù)有兩種類(lèi)型:1. 類(lèi)型參數(shù)和2. 非類(lèi)型參數(shù)。
類(lèi)型參數(shù):出現(xiàn)在模板參數(shù)列表中并跟在類(lèi)或類(lèi)型名之后的參數(shù)。
非類(lèi)型參數(shù):使用常量作為類(lèi)(函數(shù))模板的參數(shù)。該參數(shù)可以用作類(lèi)(函數(shù))模板中的常量。
比如需要在類(lèi)中打開(kāi)一個(gè)靜態(tài)數(shù)組,但是大小未知。在這種情況下,可以使用非類(lèi)型參數(shù):
另外模板偏特化翻譯,模板參數(shù)也可以寫(xiě)成默認(rèn)參數(shù):
注意:
浮點(diǎn)數(shù)、類(lèi)對(duì)象和字符串不允許作為非類(lèi)型模板參數(shù)(即只有整數(shù)族:int、long、longlong、char)。非類(lèi)型模板參數(shù)必須在編譯時(shí)確認(rèn),因?yàn)榫幾g器在編譯階段需要根據(jù)傳入的非類(lèi)型模板參數(shù)實(shí)例化對(duì)應(yīng)的類(lèi)或函數(shù)。二、 模板特化
雖然模板沒(méi)有限制類(lèi)型,但并不是所有類(lèi)型都能得到我們想要的結(jié)果。比如這樣的函數(shù)模板并不能達(dá)到我們比較字符串的目的:
這時(shí)候就需要對(duì)模板進(jìn)行特化,即在原有模板的基礎(chǔ)上,對(duì)特殊類(lèi)型進(jìn)行特殊類(lèi)型的實(shí)現(xiàn),模板特化分為函數(shù)模板特化和類(lèi)模板特化。
2.1. 函數(shù)模板特化
函數(shù)模板的特化步驟:
首先,必須有一個(gè)基本的函數(shù)模板。關(guān)鍵字模板后跟一對(duì)空尖括號(hào)。函數(shù)名后跟一對(duì)尖括號(hào),尖括號(hào)中指定需要特化的類(lèi)型。函數(shù)參數(shù)列表必須與模板函數(shù)的基本參數(shù)類(lèi)型完全一致,否則不同的編譯器可能會(huì)報(bào)一些奇怪的錯(cuò)誤。
例如,上面的字符串類(lèi)型可以特化如下:
另外模板偏特化翻譯,當(dāng)函數(shù)模板和類(lèi)型匹配函數(shù)同時(shí)存在時(shí),編譯器會(huì)優(yōu)先調(diào)用類(lèi)型匹配函數(shù),不會(huì)根據(jù)函數(shù)模板實(shí)例化對(duì)應(yīng)的函數(shù),所以函數(shù)可以直接直接給。而不是專(zhuān)門(mén):
2.2. 類(lèi)模板和全專(zhuān)業(yè)化
全特化是確定模板參數(shù)列表中的所有參數(shù)。
偏專(zhuān)業(yè)
部分特化就是將部分參數(shù)特化,或者將參數(shù)指定為指針、引用等:
當(dāng)然,如果有兩個(gè)專(zhuān)門(mén)的模板匹配,就會(huì)報(bào)錯(cuò):
三、 模板分離編譯
一個(gè)程序由多個(gè)源文件實(shí)現(xiàn)。每個(gè)源文件分別生成一個(gè) .o 目標(biāo)文件。*后,將所有目標(biāo)文件鏈接起來(lái)生成可執(zhí)行文件的過(guò)程稱(chēng)為分離編譯模式。比如函數(shù)聲明寫(xiě)在.h頭文件中,函數(shù)定義寫(xiě)在.cpp文件中。您可以通過(guò)在主文件中包含此頭文件來(lái)使用該函數(shù)。
單獨(dú)編譯有以下優(yōu)點(diǎn):
它可以提高編譯速度。比如修改了其中一個(gè)文件,單獨(dú)編譯只需要單獨(dú)編譯修改后的文件,大大節(jié)省了編譯時(shí)間。
易于管理和閱讀代碼
閱讀和管理整個(gè)文檔很麻煩。當(dāng)文檔被分成小模塊時(shí),閱讀感更好,管理更方便。3.1 為什么模板不支持單獨(dú)編譯
程序一般需要經(jīng)過(guò)以下四個(gè)步驟才能運(yùn)行:
預(yù)處理:頭文件擴(kuò)展、反注釋、宏替換、條件編譯等。代碼檢查無(wú)誤后轉(zhuǎn)成匯編語(yǔ)言。注意:頭文件不參與編譯,編譯器將項(xiàng)目中的多個(gè)源文件分開(kāi)編譯。程序集:將編譯后的程序集文件翻譯成二進(jìn)制目標(biāo)文件。鏈接:鏈接生成的目標(biāo)文件以生成可執(zhí)行文件。
綜上所述,定義的地方?jīng)]有實(shí)例化,唯一需要實(shí)例化的地方就是沒(méi)有定義的聲明,*終導(dǎo)致鏈接錯(cuò)誤。
解決方案:
將聲明和定義放在同一個(gè) .h 文件中。模板定義的位置顯示實(shí)例化(不推薦,因?yàn)樾枰约菏謩?dòng)展示和實(shí)例化一個(gè)函數(shù),會(huì)失去模板的意義)。3.2. 模板的優(yōu)缺點(diǎn)
優(yōu)勢(shì):
模板增強(qiáng)了代碼的可重用性,節(jié)省了資源,加快了迭代開(kāi)發(fā)。C++ 標(biāo)準(zhǔn)模板庫(kù) (STL) 也已生成。僅出現(xiàn)在 C++98 中的模板,以及出現(xiàn)在模板之后的 STL 庫(kù)增強(qiáng) 代碼的靈活性
相同的功能接口,但是輸入的參數(shù)類(lèi)型不同,只需要傳入不同的參數(shù),即可以實(shí)例化不同的模板代碼。比如排序問(wèn)題,可以對(duì)int型數(shù)據(jù)和cha型數(shù)據(jù)進(jìn)行排序。在不引入模板的情況下,需要編寫(xiě)兩次排序函數(shù)。引入模板后,可以在實(shí)例化時(shí)根據(jù)不同的數(shù)據(jù)類(lèi)型實(shí)例化排序方法。
缺點(diǎn):
某些 C++ 編譯器尚不支持模板。使用這些編譯器編譯包含模板的代碼時(shí),會(huì)出現(xiàn)不兼容的問(wèn)題。
不支持單獨(dú)編譯,所有使用基于模板的算法的實(shí)現(xiàn)都必須包含在整個(gè)設(shè)計(jì)的頭文件中。
相關(guān)閱讀Relate
熱門(mén)文章 Recent
- 意大利出生證翻譯模板 美國(guó)出生證明翻譯-美國(guó)三級(jí)認(rèn)證翻譯-國(guó)外證明翻譯2023-03-11
- 高考求職信作文模板帶翻譯 求職信英語(yǔ)作文帶翻譯2023-03-11
- 新版營(yíng)業(yè)執(zhí)照副本翻譯模板 國(guó)家工商行政管理局關(guān)于更換營(yíng)業(yè)執(zhí)照正本及副本封皮的通知2023-03-11
- 駕駛證翻譯模板 新版駕駛證翻譯公證模板2023-03-11
- 英語(yǔ)道歉信模板帶翻譯 英語(yǔ)四六級(jí)作文范文:道歉信2023-03-11
- 外貿(mào)專(zhuān)員采購(gòu)翻譯簡(jiǎn)歷表格模板2023-03-11
- 山東大學(xué)學(xué)位證德語(yǔ)翻譯模板 山東大學(xué)考研大綱820專(zhuān)業(yè)德語(yǔ).pdf 1頁(yè)2023-03-11
- 格里菲斯大學(xué)學(xué)位證書(shū)翻譯模板 仲薏帶你選專(zhuān)業(yè)丨南京中醫(yī)藥大學(xué)院校代碼1613專(zhuān)業(yè)簡(jiǎn)介2023-03-11
- 公證詞翻譯模板 公證書(shū)錯(cuò)誤翻譯.pdf 15頁(yè)2023-03-11
- 四六級(jí)翻譯作文模板 四六級(jí)各類(lèi)作文模版2023-03-11