関数テンプレート

クラス テンプレートは、インスタンス化の際にクラスに渡される型引数に基づいた、関連性のある複数クラスによるファミリを定義します。 関数テンプレートは、クラス テンプレートに似ていますが、定義されるのは関数ファミリです。 関数テンプレートを使用すると、同じコードに基づいているものの、異なる型またはクラスを対象にする関数のセットを指定できます。 次の関数テンプレートは、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 パラメーターの型を認識するため、この関数テンプレートでは異なる型のオブジェクトの入れ替えが防止されます。

template 宣言されていない関数も、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.
}

テンプレート引数を明示的に指定すると、通常の暗黙の型変換が実行されて、関数の引数が対応する関数テンプレート パラメーターの型に変換されます。 上の例では、コンパイラは (char j を) int 型に変換します。

参照

関連項目

関数テンプレートのインスタンス化

明示的なインスタンス化

関数テンプレートの明示的特殊化

その他の技術情報

テンプレート