共用方式為


樣板概觀

樣板有時稱為參數化類型,是根據類型參數產生函式和類別的機制。 使用樣板可以設計能在多種類型資料上運作的單一類別或函式,而不必為每一種類型建立不同的類別。

備註

例如,若要在不使用樣板的情況下,建立至少傳回兩個參數的 typesafe 函式,您會撰寫一組多載函式,如下所示:

// 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;
}

樣板的常見問題是,樣板可以做為普遍適用的方案,也就是相同程式碼適用於所有類型。 如果您需要針對特定類型自訂樣板的行為,則可以使用特製化。 使用明確特製化就可以針對特定真實類型而不是泛型類型特製化樣板。 類別樣板也可以部分特製化,在您具有多個類型參數的樣板,但只要自訂其中部分而非全部參數的行為時,會很有用。 部分特製化仍為泛型,需要真實的樣板引數才能產生實際的具現化類別。

請參閱

其他資源

樣板