前回は何となく関数テンプレートを作りましたが、あまり文法的なことには触れませんでした。ということで、今回は文法的な話をしたいと思います。果たして、あなたの推察はあっているでしょうか?
それでは、今回の要点です。
では、いってみましょう。
先ず関数テンプレートのことを話す前に、関数テンプレートでないときの関数を見てみましょう。
// 大きい方の値を返す関数(int 用) int Max(int a, int b) { return (a > b) ? a : b; } // 大きい方の値を返す関数(unsigned int 用) unsigned int Max(unsigned int a, unsigned int b) { return (a > b) ? a : b; } // 大きい方の値を返す関数(void* 用) void* Max(void* a, void* b) { return (a > b) ? a : b; } |
見ると分かると思いますが、関数の中身はどれも全く一緒です。ただ単に戻り値、引数の型が異なるだけです。
これらの関数定義を1つにまとめてしまおう、というのが関数テンプレートでした。
先ず変えたい型の所を別の名前でおくことにします。この名前は何でも構いませんが、ここでは TYPE としておきます。
TYPE Max(TYPE a, TYPE b) { return (a > b) ? a : b; } |
次に、TYPE は状況に応じて自由に変わる型だということを指定する必要があります。それが template <typename TYPE> になります。これは戻り値の型の前であればどのように書いても構いません。
template <typename TYPE> TYPE Max(TYPE a, TYPE b) { return (a > b) ? a : b; } |
これで関数テンプレート Max の完成です。
template に続く < > の中、typename で指定したものが自由に変わる型になります。その自由に変わる型を使って関数を定義すれば、自由に変わる型を持った関数、関数テンプレートを定義することができるわけです。
自由に変わる型を2つ以上持ちたいときは、typename の部分を増やせばいいだけです。
template <typename TYPE, typename TYPE2> void Disp2(TYPE a, TYPE2 b) { cout << "1 : " << a << endl << "2 : " << b << endl; } |
このように、template に続く < > の中は自由に変わる部分を指定するところです。これをテンプレート用の引数ということでテンプレート引数と呼びます。
短いですが、今回はこれで終わりです。ゆっくりまったりいきませう。
では、今回の要点です。
それでは次回まで。
Last update was done on 2000.12.6
この講座の著作権はロベールが保有しています