関数テンプレート
クラス テンプレートはインスタンス化するために渡される型引数に基づく関連クラスの系列を定義します。関数テンプレートはクラス テンプレートに似ていますが関数ファミリを定義します。関数テンプレートを使用すると同じコードに一連の関数を指定基づいていますが異なる型またはクラスを処理します。次の関数テンプレートは2 項目を交換します :
// function_templates1.cpp
template< class T > void MySwap( T& a, T& b ) {
T c(a);
a = b;
b = c;
}
int main() {
}
このコードは引数の値を交換の関数を定義します。このテンプレートからint と long の型とユーザー定義型交換関数を生成できます。MySwap はクラスのコンストラクターとコピー代入演算子が定義されたクラスを交換します。
また関数テンプレートはコンパイラがコンパイル時に a と b のパラメーターの型がわかっているため別の型のオブジェクトを交換しなくなります。
この関数はnontemplated 関数にテンプレートのバージョンを確認できるようにタイプ セーフなvoid ポインターを使用して実行することもできます。次の呼び出しを考慮します :
int j = 10;
int k = 18;
CString Hello = "Hello, Windows!";
MySwap( j, k ); //OK
MySwap( j, Hello ); //error
MySwap の 2 番目の呼び出しではコンパイラが異なる型パラメーターで 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.
}
テンプレート引数を明示的に指定するときに対応するテンプレート関数のパラメーターの型は関数の引数を変換するには通常の暗黙の型変換が実行されます。上の例では int を入力する場合コンパイラは char j() に変換します。