C 函式模板

2021-10-10 08:59:07 字數 2186 閱讀 5807

通過案例來熟悉函式模板

描述:

利用函式模板封裝乙個排序的函式,可以對不同資料型別陣列進行排序

排序規則從大到小,排序演算法為選擇排序

分別利用char陣列和int陣列進行測試

//1 交換的函式模板

template

<

typename t>

void

swap

(t& a,t& b)

//2 選擇排序 大->小

template

<

class

t>

void

sort

(t arr,

int len)}if

(max != i)

//如果最大數的下標不是i,交換兩者}}

//3 列印結果

template

<

typename t>

cout << endl;

}//4 測試

void

test1()

void

test2()

;int num =

sizeof

(b)/

sizeof

(int);

mysort

(b, num)

;printarray

(b, num);}

//5 主函式

intmain()

普通函式與函式模板區別:

普通函式呼叫時可以發生自動型別轉換(隱式型別轉換),函式模板呼叫時,如果利用自動型別推導,不會發生隱式型別轉換,如果利用顯示指定型別的方式,可以發生隱式型別轉換。

例如:

//普通函式

intmyadd01

(int a,

int b)

//函式模板

template

<

class

t>

t myadd02

(t a, t b)

//使用函式模板時,如果用自動型別推導,不會發生自動型別轉換,即隱式型別轉換

void

test01()

intmain()

建議使用顯示指定型別的方式,呼叫函式模板,因為可以自己確定通用型別t

模板的侷限性

模板的通用性並不是萬能的

例如:

template

<

class

t>

void

f(t a, t b)

在上述**中提供的賦值操作,如果傳入的a和b是乙個陣列,就無法實現了

template

<

class

t>

void

f(t a, t b)

}

在上述**中,如果t的資料型別傳入的是像person這樣的自定義資料型別,也無法正常執行。因此c++為了解決這種問題,提供模板的過載,可以為這些特定的型別提供具體化的模板。

示例:

#include

using

namespace std;

#include

class

person

string m_name;

int m_age;};

//普通函式模板

template

<

class

t>

bool

mycompare

(t& a, t& b)

else

}//具體化,顯示具體化的原型和定義是以template<>開頭,並通過名稱來指出型別

//具體化優先於常規模板

template

<

>

bool

mycompare

(person &p1, person &p2)

else

}void

test01()

else

}void

test02()

else

}int

main()

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...

c 函式模板

關鍵字template總是放在模板的電腦關於與宣告的最前面,關鍵字後面是用逗號分隔的模板參數列,該列表是模板參數列,不能為空。模板引數可以是乙個模板型別引數,它代表了一種型別 也可以是乙個模板非型別引數,它代表了乙個常量表示式。模板型別引數由關鍵字class或typename後加乙個識別符號構成。在...

C 函式模板

c 提供了函式模板 function template 所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別...