C 深度剖析教程35 函式模板的概念和意義

2021-08-19 11:50:37 字數 2085 閱讀 7775

c++中有幾種變數交換的方法?

定義巨集**塊和定義函式

#include 

#include

using

namespace

std;

#define swap(t, a, b) \

do \

while(0)

void swap(int& a, int& b)

void swap(double& a, double& b)

void swap(string& a, string& b)

int main()

上述函式是分別用巨集定義與幾個函式實現的變數的交換的方法!!!

下面我們來分析一下他們兩個的優缺點:

定義巨集**塊:

優點:

**復用,適合所有的型別

缺點:

巨集定義是在預處理階段替換的,編譯器不知道巨集的存在,無法做型別安全檢查

定義函式:

優點:

真正的函式呼叫,編譯器會對型別檢查

缺點:

根據型別重複定義函式,無法實現**復用

解決上述兩種方案的缺點:泛型程式設計

泛型程式設計:不考慮具體資料型別的程式設計方式!

對於上述swap函式,可以寫成下面這樣:

void swap(t& a,t& b)

上述的t不是指某乙個資料型別,而是泛指任意的資料型別

在c++中,泛型程式設計,指的就是:函式模板!!!

函式模板:

一種特殊函式,可用不同型別進行呼叫

看起來和普通函式類似,區別是型別可被引數化

template t>

void swap(t& a, t& b)

函式模板的語法規則:

函式模板的使用有兩種呼叫方法:

自動型別推導呼叫

具體型別顯示呼叫

下面看乙個具體的示例:

#include 

#include

using

namespace

std;

template

< typename t >

void swap(t& a, t& b)

template

< typename t >

void sort(t a, int len)}}

}template

< typename t >

void println(t a, int len)

cout

<< endl;

}int main()

; println(a, 5);

sort(a, 5);

println(a, 5);

string s[5] = ;

println(s, 5);

sort(s, 5);

println(s, 5);

return

0;}

執行結果為:

從而可以看出函式模板的強大,我們只需要寫出乙個函式,就可以使用任意的資料型別!!!

函式模板是泛型程式設計在c++中的應用之一

函式模板能夠根據實參對引數型別進行推導

函式模板支援顯示的指定引數型別

函式模板是c++中重要的**復用的方式

C 深度剖析教程36 深入理解函式模板

編譯器從函式模板通過具體型別產生不同的函式 編譯器會對函式模板進行兩次編譯 對模板進行編譯 對引數替換後的函式進行編譯 注意事項 函式模板本身不允許隱式型別轉換 include include using namespace std class test template typename t vo...

C 深度剖析教程38 類模板深度剖析

類模板可以定義任意多個不同的型別引數 類模板可以被特化 類模板的特化型別 看 include include using namespace std template typename t1,typename t2 class test template typename t1,typename t...

C 深度剖析教程39 實現C 陣列類模板

模板引數可以是數值型引數。也就是非型別引數。如下圖所示 我們可以像上面定義乙個區域性陣列,但是卻不能這樣定義 int n 10 func double n 上面這種寫法就是錯的!實際上,不光是型別引數不能為數值型模板引數,下面幾種情況也不能作為模板引數 實際上,數值型模板引數是必須在編譯階段被處理的...