範本概觀
範本,也稱為參數化型別,會產生函式和類別型別參數為基礎的機制。 藉由使用範本,您可以設計單一類別或函式在其上的許多種,而不必建立個別的類別,每種類型的資料作業。
備註
比方說,若要建立型別安全函式,傳回兩個參數的最小值,而不使用範本,您可以撰寫一組多載的函式,就像這樣:
// what_are_templates1.cpp
// compile with: /c
// min for ints
int min( int a, int b ) {
return ( a < b ) ? a : b;
}
// min for longs
long min( long a, long b ) {
return ( a < b ) ? a : b;
}
// min for chars
char min( char a, char b ) {
return ( a < b ) ? a : b;
}
藉由使用範本,您可以減少為單一函式樣板的此重複情形:
// what_are_templates2.cpp
// compile with: /c
template <class T> T min( T a, T b ) {
return ( a < b ) ? a : b;
}
範本可以大幅降低來源的程式碼的大小,並增加程式碼的彈性,但不會減少型別安全。
有兩個主要的範本類型: 函式及類別範本。 在前一個範例中, min是函式樣板。 類別樣板是具有參數,例如:
// what_are_templates3.cpp
template <class T> class A {
T m_t;
public:
A(T t): m_t(t) {}
void f(T t);
};
int main() {
A<int> a(10);
}
樣板宣告,而有些定義就像其他函式和類別,有一些重大差異。 樣板宣告未完全定義函式或類別; 它只會定義類別或函式語法的基本架構。 實際的類別或函式會從範本建立,處理程序稱為 「 執行個體化。 個別的類別或建立的函式被參照所具現化。 例如,在類別樣板:
template <class T> struct A { . . . };
可以用來執行個體化類別,可以A<int>, A<char>, A<int*>, A<MyClass*>,依此類推。
明確或隱含的方式,就可以完成的類別或函式具現化。 明確具現化時將其向外呼叫程式碼中的範本版本所產生的一種。 隱含的具現化可讓範本執行個體化,視需要在其第一次使用的位置點。
範本也可依實值參數,大小寫的範本參數類似的函式參數宣告參數化。 浮點型別和類別型別不可 」 做為實值參數。
// what_are_templates4.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
template <int i> class A {
int array[i];
public:
A() { memset(array, 0, i*sizeof(int)); }
};
int main() {
A<10> a;
}
範本常見的問題是它們可能會是一體的解決方案,這表示相同的程式碼會套用到所有的類型。 如果您要自訂特定型別的樣板的行為,您可以使用特製化。 使用明確特製化,範本可以專為特定實際型別,不是泛型型別。 類別樣板可以也部分特殊化,如果您有多重型別參數的範本,而您只想要自訂相對於一些不是所有參數的行為,這是很有用。 部分特製化一般,必須真正的樣板引數,以產生實際的執行個體化的類別。