関数テンプレート
関数テンプレートの概要:インデックス への移動
2 つの引数のどちらか大きい方を返す関数 max(x, y) を考えてみてください。x と y の型はなんらかの順位付けができる型とします。C++ は型について厳格な言語なので,引数 x と y の型をコンパイル時に宣言する必要があります。この場合,テンプレートを使わないと,使用するデータ型ごとに max のオーバーロードが必要になります。コードが基本的に変わらない場合でも,オーバーロードごとに引数を比較し,大きい方を返すわけです。
次のようにマクロを使うと,この問題を一応は避けられます。
#define max(x,y) ((x > y) ? x : y)
ただし,# define を使うと,C と一線を画する C++ のせっかくの型チェック機構を利用しないことになります。C++ では,このような古くさいマクロの使い方はしません。max(x, y) の目的は,明らかに互換性のある型どうしの比較ですが,このマクロでは互換性のない int と struct も比較してしまいます。
マクロを使うと,意図していなかった置き換えが起こるという別の難点もあります。テンプレートを使うと,データ型自体を引数として,関連のあるオーバーロード関数群に対してパターンを 1 つ定義するだけで済みます。
template <class T> T max(T x, T y){
return (x > y) ? x : y;
};
テンプレート引数 class T はデータ型を示します。アプリケーションで使うと,次のように,呼び出しに実際に使われたデータ型に基づき,コンパイラが max 関数の適切なコードを生成します。
int i;
Myclass a, b;
int j = max(i,0); // 引数は整数
Myclass m = max(a,b); // 引数は Myclass 型
クラスに限らず,どのデータ型でも class T として使えます。コンパイラが該当する operator() を呼び出してくれるので,max の引数の型として operator() が定義されている型であればどれでも使えます。