模板 引數推導與特例化

2021-08-18 10:29:35 字數 789 閱讀 5853

對於函式模板,編譯器利用呼叫中的函式實參來確定其模板引數。從函式實參來確定模板實參的過程被稱為模板實參推斷(template argument deduction)。在模板實參推斷過程中,編譯器使用函式呼叫中的實參型別來尋找模板實參,用這些模板實參生成的函式版本與給定的函式呼叫最為匹配。與非模板函式一樣,在一次呼叫中傳遞給函式模板的實參被用來初始化函式的形參。

編寫單一模板使之對任何可能的模板實參都是最合適的,這並不總能辦到。在某些情況下,通用模板的定義對特定型別是不合適的:通用定義可能編譯失敗或做得不正確。或者通用模板對於某些模板實參的處理並不高效。因此編寫特例化的模板就成為了必要。

當我們特例化乙個函式模板時,必須為原模板中的每個模板引數都提供實參。為了指出我們正在例項化乙個模板,應使用關鍵字template後面跟乙個空尖括號對。空尖括號對指出我們將為原模板的所有模板引數提供實參。

當定義函式模板的特例化版本時,我們本質上接管了編譯器的工作。即,我們為原模板的乙個特殊例項提供了定義。重要的是要弄清:乙個特例化版本本質上是乙個例項,而非函式名的乙個過載版本。因此特例化並不影響函式匹配。

類模板的特例化分為全特例化(全特化)和部分特例化(偏特化)兩種。全特化的語法與函式模板特例化大體相同。

當我們只指定一部分而非所有模板引數,或是引數的一部分而非全部特性時,即為類模板的偏特化。在《泛型思維》中偏特化的定義是:針對(任何)模板引數更進一步的條件限制所設計出來的乙個特化版本。乙個類模板的偏特化本身還是乙個模板而不是乙個例項。因此使用偏特化版本的模板時也必須為那些在特例化版本中未指定的模板引數提供實參。

本文部分內容摘自《c++ primer 中文版(第五版)》

模板類,模板類函式特例化,模板類特例化

今天在看某c 框架原始碼時,發現模板類裡的部分函式可以特例化,感覺很神奇便嘗試了下,發現很多平時不會注意的c 細節及知識,寫下來分享給大家,以便大家遇到相似問題時可以少踩點坑。模板類會出現鏈結問題,編譯不通過 如果模板類.h檔案和.cpp檔案分開存放,然後編譯的時候會提示鏈結錯誤,無法生產exe檔案...

模板特例化 過載

名詞解釋 靜多型 靜多型 static polymorphism 是多型性的一種,繫結發生在編譯期 compile time 稱為靜態繫結static binding 非引數化多型和引數化多型並不衝突,而且相輔相成,它們混合使用能夠帶來更大的靈活性,函式模板 過載就是很好的例子。include in...

C 模板,模板具體化,特例化

函式同名 過載 時,呼叫優先順序通常為 普通函式 顯式具體化 template specilazation 顯式例項化 一般模版函式 但更一般而言,有兩條規則 1 如果各自函式形參和呼叫處的實參 並非精確匹配,則會優先選擇不需要轉換的 比如void func string str template ...