函式樣板
類別樣板定義一系列相關的類別為基礎的類別執行個體化時傳遞的型別引數。 函式樣板是類似於類別樣板,但定義函式家族。 使用函式樣板,您可以指定一組相同的程式碼,但是處理不同的型別或類別為基礎的函式。 下列函式樣板交換兩個項目:
// function_templates1.cpp
template< class T > void MySwap( T& a, T& b ) {
T c(a);
a = b;
b = c;
}
int main() {
}
這段程式碼將定義交換的引數的值的函式家族。 您可以從這個範本,來產生函式,將會交換int和長型別,以及使用者定義型別。 MySwap即使將會交換類別如果適當定義類別的複製建構函式和設定運算子。
此外,函式樣板會阻礙您交換物件型別不同,因為編譯器知道的型別,所以a和b在編譯時期的參數。
非樣板函式,就無法執行這個功能,雖然範本版本使用 void 指標是型別安全。 請考慮下列呼叫:
int j = 10;
int k = 18;
CString Hello = "Hello, Windows!";
MySwap( j, k ); //OK
MySwap( j, Hello ); //error
第二個MySwap呼叫會觸發將產生編譯時期錯誤,因為編譯器無法產生MySwap函式具有參數型別不同。 如果使用 void 指標,同時函式呼叫正確,編譯,但函式可能無法正常運作在執行階段。
允許的樣板引數的函式樣板的明確規格。 例如:
// function_templates2.cpp
template<class T> void f(T) {}
int main(int j) {
f<char>(j); // Generate the specialization f(char).
// If not explicitly specified, f(int) would be deduced.
}
明確指定樣板引數時,標準的隱含轉換完相對應的函式樣板參數的型別轉換函式引數。 在上述範例中,編譯器會將轉換 (char j) 可以在此輸入int。