関数テンプレート

提供: RAD Studio
移動先: 案内検索

関数テンプレートの概要:インデックス への移動

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) の目的は,明らかに互換性のある型どうしの比較ですが,このマクロでは互換性のない intstruct も比較してしまいます。

マクロを使うと,意図していなかった置き換えが起こるという別の難点もあります。テンプレートを使うと,データ型自体を引数として,関連のあるオーバーロード関数群に対してパターンを 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() が定義されている型であればどれでも使えます。

関連項目