在計算機程式設計領域,為了避免因資料型別的不同,而被迫重複編寫大量相同業務邏輯的程式碼,人們發展的泛型及泛型程式設計技術。
那麼,什麼是泛型呢?本節就帶領讀者深度剖析一下這個問題。
所以泛型,實質上就是不使用具體資料型別(例如 int、double、float 等),而是使用一種通用型別來進行程式設計的方法,該方法可以大規模的減少程式程式碼的編寫量,讓程式設計師可以集中精力用於業務邏輯的實現。
為了更好地說明使用具體資料型別有多麼麻煩,這裡先舉個例子,假設客戶需要一個函數,功能是返回兩個 int 型別資料中較大的那個,很多讀者自然而然會編寫如下程式碼:
int maxt(int x, int y) {
return (x > y) ? x : y;
}
可是沒過幾天,該使用者又提出需要編寫一個返回兩個 double 型別資料中較大的那個,於是我們需要之前的程式碼進行修改:
double maxt(double x, double y) {
return (x > y) ? x : y;
}
之後,該使用者又提出需要再編寫一個能返回兩個 char 型別資料中較大的那個...。可以看到,只是因為資料型別不同,就迫使我們不得不把具有相同功能的程式碼寫了若干遍,這樣的實現方法簡直令人崩潰。
為了解決類似的問題,有聰明的人將程式碼修改成如下的樣子:
T maxt(T x, T y) {
return (x > y) ? x : y;
}
如此,當使用者需要某個資料型別的 maxt 函數時,我們只需要把其中的 T 替換成使用者需要的實際資料型別就行了。
那麼,程式碼中的 T 是什麼呢?很明顯,這是一個預留位置,更確切的說是一個型別預留位置。也就是說,將來在 T 這個位置上的是一個真實、具體的資料型別,至於到底是哪個型別,完全取決於使用者的需求。
當然,如果硬要給 T 這種型別預留位置也叫做一種資料型別,提供這種想法的發明者稱它為
泛型(generic type),而使用這種型別預留位置的程式設計方式就被稱為
泛型程式設計。
值得一提的是,既然泛型並不是真實的資料型別,那麼使用泛型編寫的程式碼也就不是真正的程式實體,只能算是一個程式實體的樣板。故此,通常形象的將這種使用了泛型的程式碼稱為
模板,由模板生成實際程式碼的過程稱為
模板的具體實現。
注意,型別預留位置的替換工作,不需要人為操控,可以完全交由計算機來完成,更準確的說,是交由編譯器在編譯階段來完成模板的具體實現。
總之一句話,泛型也是一種資料型別,只不過它是一種用來代替所有型別的“通用型別”。在 C++ 中,用以支援泛型應用的就是標準模板庫 STL,它提供了 C++ 泛型設計常用的類別範本和函數模板。
有關 STL 模板庫,由於不是本節重點,這裡不再贅述,後續章節會做詳細介紹。