1. 程式人生 > 其它 >STL:函式模板

STL:函式模板

1.函式模板
使用模板 型別引數化 編寫程式碼可以忽略型別

2.函式模板和類模板
函式模板針對僅引數型別不同的函式
類模板針對僅資料成員和成員函式型別不同的類

3.函式模板通式
template 只對其後的第一個函式有效

template <class 形參名,class 形參名,......>
返回型別 函式名(引數列表)
{
函式體
}

4.呼叫函式模板的兩種方式

  • 自動型別推導
  • 顯示的指定型別
template<class T>   // template<typename T>
void mySwap(T &a, T &b)
{
    T temp 
= a; a = b; b = temp; } //使用函式模板 void test01(){ //1. 自動型別推導 編譯器根據你傳進去的值進行型別自動推導 int a = 10; int b = 20; cout << "a:" << a << " b:" << b << endl; mySwap(a, b); cout << "a:" << a << " b:" << b << endl; double
da = 1.13; double db = 1.14; cout << "da:" << da << " db:" << db << endl; mySwap(da, db); cout << "da:" << da << " db:" << db << endl; //2. 顯示的指定型別 a = 10; b = 20; cout << "a:" << a << " b:
" << b << endl; mySwap<int>(a, b); mySwap<>(a, b); cout << "a:" << a << " b:" << b << endl;

5.函式模板和普通函式的區別
普通函式可以進行自動型別轉換 但是函式模板必須嚴格型別匹配
比如一個引數為int的普通函式 你可以傳short和char作為引數 但是函式模板不行

6.函式模板和普通函式在一起的呼叫規則

  • 函式模板可以像普通函式那樣被過載
//1.模板過載
template<class T>
void myPrint(T a)
{
    cout << a << endl;
}

template<class T1, class T2>
void myPrint(T1 a, T2 b)
{
    cout << a << "  " << b << endl;
}
  • C++編譯器優先考慮普通函式
  • 如果函式模板可以產生一個更好的匹配,那麼選擇模板
  • 可以通過空模板實參列表的語法限定編譯器只能通過模板匹配,例如 mySwap<>(a, b);