天天看點

泛型程式設計簡介

    在資料結構中,很大的一個特點就是隻專注于資料元素之間的關系及特定結構上的算法,并不關注資料元素的具體類型。鑒于這個特點, 不考慮資料類型的泛型程式設計就非常适合用于資料結構。

    泛型程式設計是不考慮具體資料類型的程式設計方式

    例如對于交換兩個數值的函數Swap,就可以考慮下邊的泛型寫法

void Swap(T& a, T& b)
{
    T temp;
    temp = a;
    a = b;
    b = temp;
}
           

函數參數中的T指的是任意的資料類型,而不是 具體某一個類型。C++中函數支援泛型程式設計,也叫函數模闆

    -函數模闆是一種特殊的函數,可用不同類型進行調用

    -外觀跟普通函數相似,但是類型可被參數化

template <typename T>
void Swap(T& a, T& b)
{
    T temp;
    temp = a;
    a = b;
    b = temp;
}
           

一個簡單的變量交換的函數模闆 如上,函數模闆的文法規則為:

    - template 關鍵字用于聲明開始進行泛型程式設計

    - typename 關鍵字用于聲明泛指類型

函數模闆的使用有兩種方式

    - 自動類型推導調用

    - 具體類型顯示調用

int a = 12;
int b = 23;
Swap(a, b);	        //自動類型推導
Swap<int>(a, b);	//類型顯示調用
           

完整代碼執行個體:

#include <iostream>

using namespace std;

template <typename T>
void Swap(T& a, T& b)
{
    T temp;
    temp = a;
    a = b;
    b = temp;
}

int main()
{
    int a = 12;
    int b = 23;
    Swap(a, b);		//自動類型推導調用
    cout << "a = " << a << endl << "b = " << b << endl;

    double n = 12.34;
    double m = 23.21;
    Swap<double>(n, m);		//類型顯示調用
    cout << "n = " << n << endl << "m = " << m << endl;

    system("pause");

    return 0;
}
           

編譯輸出:

泛型程式設計簡介

    C++中的類模闆,規則與函數模闆基本相同,隻是調用時隻能顯示指定具體類型,編譯器無法自動推導,下邊直接以例子來展示

#include <iostream>
#include <string>

using namespace std;

template <typename T>
class Operator
{
public:
    T Add(T a, T b)
    {
    	return a + b;
    }
};

int main()
{
    Operator<int> oper1;    //使用時需要顯示指定具體類型
    cout << "oper1.Add(12, 34) = " << oper1.Add(12, 34) << endl;

    Operator<string> oper2;    //使用時需要顯示指定具體類型
    cout << "oper2.Add(\"hello\", \"world\") = " << oper2.Add("hello", " world") << endl;

    system("pause");

    return 0;
}
           

編譯輸出:

泛型程式設計簡介

總結

    - 模闆是泛型程式設計理論在C++中的實作

    - 函數模闆支援參數的自動推導和顯示指定

    - 類模闆在使用時隻能顯示指定類型

    - 類模闆非常适用于編寫資料結構相關的代碼