56_函數模板的概念和意義

關鍵詞:泛型編程、函數模板

0. 問題:C++中有幾種交換變量的方法?

(1) 定義宏代碼塊:
優點:代碼復用,適合所有的類型
缺點:編譯器不知道宏的存在,缺少類型檢查
(2) 定義函數
優點:真正的函數調用,編譯器對類型進行檢查
缺點:根據類型重復定義函數,無法代碼復用

1. 泛型編程

  • 概念:不考慮具體數據類型的編程方式
  • 語法規則:
void Swap(T& a, T& b)
{
    T t = a;
    a = b;
    b = t;
}

Swap泛型寫法中T不是一個具體的數據類型,而是泛指任意的數據類型

  • 方法:
    (1) 函數模板
    (2) 類模板

2. 函數模板

  • 概念:一種特殊的函數可用不同類型進行調用,看起來和普通函數很相似,區別在于類型可被參數化
  • 語法規則:
template <typename T>
void Swap(T& a, T&b)
{
    T t = a;
    a = b;
    b = t;
}

template關鍵字用于聲明開始進行泛型編程
typename關鍵字用于聲明泛型類型

  • 使用方法:
    (1) 自動類型推導調用
int a = 0;
int b = 1;

Swap(a, b);

(2) 具體類型顯示調用

double c = 2;
double d = 3;

Swap<float>(c, d);

編程說明:函數模板初探

#include <iostream>
#include <string>

using namespace std;

template < typename T >     // 函數模板
void Swap(T& a, T& b)
{
    T c = a;
    a = b;
    b = c;
}

int main()
{
    int a = 0;
    int b = 1;
    
    Swap(a, b);         // ==> Swap<int>(a, b);
    
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    
    double c = 2;
    double d = 3;
    
    Swap(c, d);         // ==> swap<double>(a, b);
    
    cout << "c = " << c << endl;
    cout << "d = " << d << endl;
    
    string l = "lll";
    string i = "iii";
    
    Swap<string>(l, i);
    
    cout << "l = " << l << endl;
    cout << "i = " << i << endl;
    
    return 0;
}

輸出結果

a = 1
b = 0
c = 3
d = 2
l = iii
i = lll

3. 小結

  • 函數模板是泛型編程在C++中的應用方式之一
  • 函數模板能夠根據實參對參數類型進行推導
  • 函數模板支持顯示的指定參數類型
  • 函數模板是C++中重要的代碼復用方式
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容