テンプレートの概要
パラメーター化された型と呼ばれるテンプレートは型パラメーターに基づいて生成関数およびクラスの機能です。テンプレートを使用してさまざまな種類のデータを操作する単一のクラスをデザインしたり各型の別のクラスを作成せずに機能します。
解説
たとえば次のような一連のオーバーロードされた関数の記述方法を返す最小テンプレートが使用しないで 2 個のパラメーター確認できるようにタイプ セーフなを作成する方法についてする :
// 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;
}
テンプレートはソース・コードのサイズを小さくしタイプ セーフを減らしコードの柔軟性を向上させることができます。
テンプレートの 2 種類の主要な種類があります : 関数テンプレートとテンプレート クラス。前の例では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;
}
テンプレートに関する一般的な問題はコードがすべて同じになる適用されることを意味する汎用型のソリューションにできることです。特定の型のテンプレートの動作をカスタマイズする場合特化を使用できます。明示的な特殊化を使用してテンプレートには特定の実際の型ではなくジェネリック型に特化することができます。一部のすべてのパラメーターに対して動作をカスタマイズするにはのに役立つ複数の型パラメーターのテンプレートがある場合にだけではクラス テンプレートは部分的に特化することができます。部分的特殊化は実際によってインスタンス化されるクラスを生成するとジェネリックの実際のテンプレート引数です。