上篇部落格中講述了多型的相關知識,其中靜態多型有兩種:函式過載和泛型程式設計。函式過載在部落格中已經解釋過,接下來看看泛型程式設計的相關知識。
泛型程式設計:編寫與型別無關的邏輯**,是**復用的一種手段,而模板就是泛型程式設計的基礎。
模板:模板分為函式模板和類模板。
具體來介紹函式模板與類模板。
《一》、函式模板
函式模板:函式模板代表了乙個函式家族,該函式與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。
模板的例項化:模板本身不是類或函式,編譯器用模板產生指定的類或者函式的指定型別版本,產生模板特定型別的過程稱為函式模板例項化。
下面舉例說明為:
#include
#include
using
namespace
std;
template
t add(t a, t b)
int main()
結果顯示為:
在此舉例中會發現add
(4.5, 6.45) 和add(4,(int)6.5).它們分別是顯示例項化和隱式例項化,若給成add(4,6.5)這種形式編譯器無法進行編譯,因為其各自的型別不一致。而在顯式例項化中編譯器會自動生成乙個函式。
另外要注意的是模板被編譯了兩次。1.例項化之前,檢查**本身,檢視是否出現語法錯誤,但不是每個錯誤均可找出。
2.在例項化期間,檢查末班**,檢視呼叫的是否都有效。如:例項化型別不支援某些函式呼叫。
template
t>
t add(t a, t b)
int main()
```該模板可以變異通過,但是在例項化的編譯中無法通過編譯,因為 return (a + b)後面缺少分號。
**型別形參轉換**:一般不會轉換實參匹配已有的例項化,而是會產生新的例項。
編譯器會執行兩種轉換:
1、const 轉換:接收const引用或者const指標的函式分別用非const物件的引用或者指標來呼叫。
class="se-preview-section-delimiter">div>
這裡寫**片
「`2、陣列或函式到指標的轉換:如果模板形參不是引用型別,則對陣列或函式型別的實參應用常規指標轉換。
陣列實參將當做指向其第乙個元素的指標,函式實參當做指向函式型別的指標。
template
void funtest(const t &a)
int main()
結果如圖所示:
2、陣列或函式到指標的轉換:如果模板形參不是引用型別,則對陣列或函式型別的實參應用常規指標轉換。
陣列實參將當做指向其第乙個元素的指標,函式實參當做指向函式型別的指標。
具體舉例如下:
template
void funtest(const t a)
int main()
template
void funtest(const t a)
int main()
結果如圖顯示:
相同若傳函式,則其型別為函式指標型別。
模板引數
模板形參:型別形參,非型別形參。
模板形參名字只能在模板形參之後到模板宣告或定義之前使用,遵循名字遮蔽原則。
typedef
int t;
template
void funtest(t t)
;t g;
int main()
顯示結果為:
非模板型別引數:非模板型別形參是模板內部定義的常量,在需要常量表示式的時候,可以使用非模板型別引數。具體舉例如下:
其中的int n為非模板型別的形參。n不同所代表的函式也不同。
模板形參說明:
1、模板形參表使用<>,和函式引數列表一樣,跟多個引數時必須用逗號隔開,型別可以相同可以不同。例如:template
template
t max(const t&a, const t&b)//給成引用節省空間
//若是三個進行比較則要進行過載
template
t max(const t&a, const t&b, const t&c)
int main()
當然該模板並不能進行字串的比較,那麼應該怎麼辦呢?
例如:
template
int compare(t a, t b)
int main()
結果會發現他比較的僅是這兩者的位址大小,答案並不正確
下面我們又提出了解決方法—-特化
模板函式特化:如兩個字串的比較,我們給出特化形式為
template
<>
int compare
char*>(const
char* const a,const
char* const b)
結果修正為:
template
int compare(t a, t b)
template
<>
int compare
char*>(const
char*const a, const
char* const b)
int main()
最後關於特化:特化不能出現在模板例項的呼叫之後,應該在標頭檔案中包含模板特化的宣告,然後使用該特化版本的每個原始檔包含標頭檔案。 函式模板(泛型程式設計)
函式模板就是將函式型別引數化,方便程式設計。1 普通函式模板 include using namespace std template template是告訴編譯器,要開始泛型程式設計了,並用t替代函式的引數型別 void myswap t a,t b template 定義兩個泛型,其實定義乙個也...
泛型程式設計 函式模板
當函式的業務邏輯相同但是函式的引數不相同時,讓型別引數化,讓程式設計師能夠方便程式設計,就用到了泛型程式設計。基本語法 includeusing namespace std 函式的業務邏輯一樣但是函式的引數不一樣 void myswap01 int a,int b void myswap02 cha...
C 泛型程式設計 函式模板 類模板
以前我們寫過乙個簡單的交換函式。我們不難發現交換函式是與型別有很大關係的,int,double.那麼如何實現乙個通用的交換函式呢?void swap int left,int right void swap double left,double right void swap char left,c...