C++ Template 教學
平時我們是怎樣寫Code的
假設我要寫一個計總和的function:
1 | int sum(int a, int b) { |
這個program是正確的,但是function只限於integer.
雖然我大可以寫多幾個function,但這樣很麻煩。
編寫sum()
能使用任何類型的參數的一個版本是否會更有效?
Function templates 使我們能夠做到這一點!
Function templates
使用Function templates,基本思想是避免為每個variable指定確切data type的必要。
C++為我們提供了使用佔位符類型(稱為template type parameters)來定義function。
Syntax :
1 | template <class T> |
示範:
1 | template <class T> |
現在可以見到,他會自動對應double和integer。
另一例子:
When creating a template type parameter, the keyword typename may be used as an alternative to the keyword class: template
.
In this context, the keywords are identical.
Function templates只需要編寫一次,並且可以使用不同的類型,因此可以節省大量時間,大大減少重複代碼,更減少了代碼維護。
使用Function templates的另一個優勢是增強了安全性,因為它不需要手動複製function和更改data type。
Function templates with Multiple Parameters
Function templates還使處理多種通用數據類型。 使用逗號分隔的列表定義數據類型。
現在我們寫一個function去比較各種數據類型(一個int和一個double)的Parameter,並return較小的Parameter。
1 | template <class T, class U> |
例子:
1 | template <class T, class U> |
T是Type的縮寫,是Type參數的廣泛使用的名稱。
沒有說一定要使用T,您可以使用任何適合您的標識符來聲明類型參數(不能用C++ keywords)。
Class Templates
Class Templates Like function templates, class templates are useful when a class defines something that is independent of the data type.
Can be useful for classes like LinkedList, BinaryTree, Stack, Queue, Array, etc.
如果您在Class之外定義member function(例如在單獨的source file),則需要特定的語法。
您需要在Class名稱後的尖括號中指定通用類型。
1 |
|
Template Specialization
對於常規的Class template,Class處理不同Data Type的方式是相同的。 所有Data Type都運行相同的代碼。
當將特定Type作為template parameter傳遞時,Template Specialization允許不同Data Type運行不同的代碼。
要為數據類型char指定不同的行為,我們就要用到template specialization。
1 | template <class T> |
例子:
1 |
|
Keep in mind that there is no member “inheritance” from the generic template to the specialization,
so all members of the template class specializations must be defined on their own.