如下**所示,幾個函式間在函式體一致或者是相差不大是時,就是資料型別不一樣,如是單獨寫三個函式,會有一點麻煩,這時,提供乙個函式模板(抽離出引數列表中不一樣的部分),會使得編寫過程不至於枯燥繁瑣,也使得後期修改更加方便。
int
max(
int a,
int b)
;int
max(
double a,
double b)
;int
max(
int*a,
int*b)
;
max的函式模板:
template
<
typename t>
//函式頭。尖括號裡面的乙個或多個識別符號表示我們希望推遲決定的資料型別
t max
(t a, t b)
函式模板,顧名思義就是乙個模具,並不是乙個函式。
模板的例項化就是給模板乙個實際的模板引數。
int
main()
max(1, 2) 會生成乙個具體的函式1:
int
max(
int a,
int b)
max(1.1, 2.1)跟max(1, 2)一樣 會生成乙個具體的函式2:
double
max(
double a,
double b)
值得注意的是:max(2, 3) 不會再生成具體函式,而是直接將實際引數傳給之前生成的函式1。
其實模板例項化過程中,也可以去掉尖括號及其裡面的內容編譯器可以根據呼叫函式模板傳遞的實際函式引數自動推斷出模板引數型別:
int
main()
當然這種寫法是由侷限性的:max(1, 2.1)函式模板裡函式形參是同一型別的,而這裡的引數型別不一致,所以無法確定模板型別引數是什麼型別的。此時就必須使用顯示例項化:max1, 2.1).
就跟函式過載一樣,可以定義和函式模板名同名的函式或函式模板:
template
<
typename t>
t min
(t m, t n)
template
<
typename t>
t min
(int m,
int n)
template
<
typename t>
t*min
(t* m, t* n)
int*
min(
int* m,
int* n)
就和普通函式過載一樣,編譯器會根據模板引數或函式引數確定最匹配的例項化函式:
int
main()
c 函式模板1
1 定義 函式模板 只適用於引數個數相同但是型別不同 而且函式體相同的情況 2 這個例子沒有使用模板的情況 include using namespace std void swap int a,int b void swap double a,double b intmain1 3 使用模板以後 ...
C 模板實戰1 函式模板
模板本身不是可編譯的 而是用來指導編譯器生成可編譯 的文字。1 函式模板引數 函式模板引數可以根據模板實參自動推導,也就是說可以從實參自動推導的模板引數可以省略書寫,但是要注意以下幾個規則 1 編譯器只根據函式呼叫時給出的實參列表推導模板引數值,與函式引數無關的模板引數無法推導 2 與函式返回值相關...
c 函式模板
include using namespace std template t max t a,t b,t c int main int main int i1 185,i2 76,i3 567,i double d1 56.63,d2 90.23,d3 3214.78,d long g1 67854...