天天看點

【C++】泛型程式設計和模闆

泛型程式設計:編寫與資料類型無關的邏輯代碼,是代碼複用的一種手段。

泛型這個詞并不是通用的,在不同的語言實作中,具有不同的命名。在Java/Kotlin/C#中稱為泛型(Generics),在ML/Scala/Haskell中稱為Parametric Polymorphism,而在C++中被叫做模闆(Template),比如最負盛名的C++中的STL。任何程式設計方法的發展一定是有其目的,泛型也不例外。

泛型的主要目的是加強類型安全和減少強制轉換的次數。

為什麼要用泛型程式設計:

       當我們希望可以用同一個函數處理不同類型的參數時(比如寫一個加法函數,可以處理各種不同類型的資料)都有哪些方法呢?

1、函數重載(同一作用域;函數名相同;參數清單不同)

缺點:

        a、隻要有新類型出現,就必須添加對應的函數

        b、除了類型外,所有的函數體都相同,代碼的複用率太低

        c、如果隻是傳回類型不同,函數重載不能實作

        d、一個方法有問題,所有的方法都有問題,不好維護

2、使用公共基類,将所有通用的代碼放在公共的基類裡面(通過繼承的方式将其複用)

        a、借助公共基類來編寫通用代碼将失去類型檢查的優點

        b、對于以後實作的許多類,都必須繼承自某個特定的基類,代碼維護更賤困難

3、使用特殊的預處理程式(使用宏)

        a、不是函數,不會進行類型檢測,安全性不高

        b、不能調試

        c、經常會有副作用(除非将每一項都打上括号)

        d、直接替換的方式,如果多次使用會使代碼變得越來越長

接下來要介紹的另外一種新的方法--------泛型程式設計

模闆形參名在同一模闆形參清單中隻能使用一次。所有模闆前面必須加上class或者typename.

【C++】泛型程式設計和模闆
舉個例子

#include <iostream>
using namespace std;

template <class T>
T Add(T left, T right)
{
return left + right;
}

int main()
{
cout << Add(1, 2)<<endl;//T為int
cout << Add(1.1, 2.2)<<endl;//T為double

//cout << Add(1, 2.2) << endl;
cout << Add(1, (int)2.2)<<endl;//T為int
cout << Add<int>(1, 2.2)<<endl;//顯示執行個體化

return 0;
}      

上邊這個例子,當不将主函數中的第三行代碼注釋的話是會因為兩個實參的類型不同而報錯,遇到這種情況,我們可以用強制類型轉化或顯示執行個體化的方式解決。

注釋前

将其注釋後通過編譯,沒有任何錯誤。