我們前面剛剛學習了函數重載,可以處理多種資料類型,雖然是同一個名字,但仍然要分開定義,如果再能讓程式碼精簡一些,模板化,就再好不過了!為此,C++提供函數模板這個機制,大大提高程式碼的可重複使用性。
函數模板,是可以創建一個通用的函數,可以支援多種形參。用關鍵字template來定義,形式如下:
template<class類型名稱1,class類型名稱2…>傳回值函數名稱(形狀參表列)模板參數表{函數體}
說明一下,這個一般形式中,第一行的template<class 類型名1,class 類型名2…>是一句聲明語句,template是定義模板函數的關鍵字,尖括號裡可以有多個類型,前面都要用class(或typename來定義)。然後後面跟定義的函數模板,切記中間不可以加其他的語句,不然會報錯!
下面,我們舉個具體的例子來看一下!
#include<iostream>usingnamespacestd;template<classT1,classT2>T1add(T1x,T2y){cout<<sizeof(T1)<<,<<sizeof(T2)<<t;returnx+y;}intmain(){ cout<<add(10,20)<<endl;;cout<<add(3.14,5.98)<<endl;cout<<add('A',2)<<endl;return0;}
以上是一個加法函數的模板,大家可以看到我們定義了一個add的函數模板,裡面的變數類型都用T1和T2取代。
在主函數中,實際呼叫時,我們呼叫了三次,分別有三種不使用的型別傳入,模板函數中的T1和T2型別將根據實際傳入的型別變成具體類型,這個化成就叫做模板的實例化。
然後我們運行程序,可以看到每次呼叫的類型T1和T2到底是什麼類型,有多大字節,以及求和的結果。運行效果如下:
大家可以對照程式碼逐行理解並親自上機實驗完成。