通過案例來熟悉函式模板
描述:
利用函式模板封裝乙個排序的函式,可以對不同資料型別陣列進行排序
排序規則從大到小,排序演算法為選擇排序
分別利用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 所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別...