??????? 我們可以建立template classes,使它們能夠神奇地操作任何類型的資料。下面這個例子是讓CThree 類別儲存三個成員變量,成員函數Min 傳回其中的最小值,成員函數Max 則傳回其中的最大值。我們把它設計為template class,以便這個類別能適用于各式各樣的數據類型:
template <class T>class CThree{public :CThree(T t1, T t2, T t3);T Min();T Max();private:T a, b, c;};
????? 語法還不至于太稀奇古怪,把T 看成是大家熟悉的int 或float 也就是了。下面是成員函數的定義:
template <class T>T CThree<T>::Min(){T minab = a < b ? a : b;return minab < c ? minab : c;}template <class T>T CThree<T>::Max(){T maxab = a < b ? b : a;return maxab < c ? c : maxab;}template <class T>CThree<T>::CThree(T t1, T t2, T t3) : a(t1), b(t2), c(t3){return;}
??????? 這里就得多注意些了。每一個成員函數前都要加上template <class T>,而且類別名稱應該使用CThree<T>。
//以下是template class 的使用方式:#include <iostream.h>void main(){CThree<int> obj1(2, 5, 4);cout << obj1.Min() << endl;cout << obj1.Max() << endl;CThree<float> obj2(8.52, -6.75, 4.54);cout << obj2.Min() << endl;cout << obj2.Max() << endl;CThree<long> obj3(646600L, 437847L, 364873L);cout << obj3.Min() << endl;cout << obj3.Max() << endl;}
執行結果如下:
? 2 5
-6.75
8.52
364873
646600
???? 對程序員而言C++ templates 可說是十分容易設計與使用,但對于編譯器和聯結器而言卻是一大挑戰。編譯器遇到一個template 時,不能夠立刻為它產生機器碼,它必須等待,直到template 被指定某種類型。從程序員的觀點來看,這意味著template function 或template class 的完整定義將出現在template 被使用的每一個角落,否則,編譯器就沒有足夠的信息可以幫助產生目的碼。當多個源文件使用同一個template 時,事情更趨復雜。
???? 隨著編譯器的不同,掌握這種復雜度的技術也不同。有一個常用的技術,Borland 稱之為Smart,應該算是最容易的:每一個使用Template 的程序代碼的目的檔中都存在有template碼,聯結器負責復制和刪除。
???? 假設我們有一個程序,包含兩個源文件A.CPP 和B.CPP,以及一個THREE.H(其內定義了一個template 類別,名為CThree)。A.CPP 和B.CPP 都包含THREE.H。如果A.CPP以int 和double 使用這個template 類別,編譯器將在A.OBJ 中產生int 和double 兩種版本的template 類別可執行碼。如果B.CPP 以int 和float 使用這個template 類別,編譯器將在B.OBJ 中產生int 和float 兩種版本的template 類別可執行碼。即使雖然A.OBJ 中已經有一個int 版了,編譯器沒有辦法知道。然后,在聯結過程中,所有重復的部份將被刪除。