C++ 函式模板
定義:通用的函式描述,使用泛型來定義函式,其中的泛型可用具體的型別(如 int、double )替換,通過將型別作為引數傳遞給模板,可使編譯器生成該型別的函式,
建立模板:
1 template <typename AnyType> 2 void Swap(AnyType & a, AnyType & b) 3 { 4 AnyType temp; 5 temp=a; 6 a=b; 7 b=temp; 8 }
- 關鍵字 template 和 typename 是必須的,除非使用關鍵字 class 代替 typename ,另外,必須使用尖括號 < > ,
多載的模板:
-
定義:
- 起因:使用模板時并非所有的型別都使用相同的演算法,
- 解決:像多載常規函式那樣多載模板定義,和常規多載一樣,被多載的模板的函式特征標必須不同,
- ( T &, T & ) ( T[], T[], int )
模板的局限性:
- 無法處理一些型別,如 swap(T &a, T &b) 無法交換陣列,
- 有時通用化是有意義的,但 C++ 語法不允許,如將兩個結構相加,
- 多載運算子
- 提供具體化模板定義,
顯示具體化:
- template<> 打頭,通過名稱指出型別,
1 template<typename T> 2 void Swap(T &, T &); 3 4 template<> void Swap<job>(job &, job &); // 或 template<> void Swap(job &, job &);
- 非模板優先于模板,而顯示具體化優先于常規模板,
模板實體:
- 編譯器使用模板為特定型別生成函式定義時,得到的是模板實體,
- 隱式實體化、顯示實體化
顯示實體化:
- template void Swap<int>(int, int);
- 宣告時沒有定義,
- 可直接在程式中使用而不宣告 Add<double>(double 實參1, double 實參2)
- 實參轉形引數具備強轉功能,精度降低不警告,
1 int i; 2 double j; 3 Add<double>(i,j); // 引數 i 傳遞的值被轉換成了 double 型別
注意:
- 在同一個檔案或轉換單元中使用同一種型別的顯示實體和顯示具體化將出錯,
- 模板并不創建任何函式,而只是告訴編譯器如何定義函式,
- 在標準 C++ 98 添加關鍵字 typename 之前,C++ 使用關鍵字 class 來創建模板,
- 常見的情形是:將模板放在頭檔案中,并在需要使用模板的檔案中包含頭檔案,
- 如果需要多個將同一種演算法用于不同型別的函式,使用模板;如果不考慮向后兼容的問題,并愿意鍵入較長的單詞,則宣告型別引數時,應用 typename 而不是 class ,
- 函式模板不能縮短可執行程式,最終的代碼不包含任何模板,而只包含為程式生成的函式,使用模板的好處是使生成多個特定函式定義起來更簡單、可靠,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/36262.html
標籤:C++
