まずは、どのような形式で書くかを解説します。テンプレート自体比較的
新しい機能なので、これをサポートしていない処理系があるかもしれません。
と、こんな感じになります。使うときはTの所に任意のデータ型が来ることになります。 さて、メンバ関数をクラス外で定義するときは、template <typename T,...> class ClassX { ... };
のようになります。< >で囲まれたリストを忘れやすいので注意してください。template <typename T> class ClassX { public: T func(T); }; template <typename T> T ClassX <T> :: func(T x) { .... }
では、サンプルを作ってみましょう。これはユーザーがいろいろなタイプの データを入力するのでそれをそのまま返すものです。(意味のないプログラムです)
メンバ関数のshowは引数をそのまま返すだけのもっとも単純な関数です。// clsstemp.cpp #include <stdio.h> #include <string.h> template <typename T> class Test { public: T show(T); }; template <typename T> T Test <T>::show(T userinput) { return userinput; } int main() { char c, d; int i, j; char str[256], *strx; Test<char> MyChar; Test<int> MyInt; Test<char *>MyStr; printf("1バイト文字を入力してください-->"); scanf("%c", &c); d = MyChar.show(c); printf("入力したのは「%c」だね\n", d); printf("整数を入力してください-->"); scanf("%i", &i); j = MyInt.show(i); printf("入力したのは「%d」だね\n", j); printf("文字列を入力してください-->"); scanf("%s", str); strx = MyStr.show(str); printf("入力したのは「%s」だね\n", strx); return 0; }
実行結果は左のようになります。
では、同じプログラムをメンバ関数をクラス内で記述するとどうなるでしょうか。
クラス内でメンバ関数の記述を行うと少し簡単になりました。// clsstemp2.cpp #include <stdio.h> #include <string.h> template <typename T> class Ret { public: T show(T x) { return x; } }; int main() { char c, d; int i, j; char str[256], *strx; Ret<char> MyChar; Ret<int> MyInt; Ret<char *>MyStr; printf("1バイト文字を入力してください-->"); scanf("%c", &c); d = MyChar.show(c); printf("入力したのは「%c」だね\n", d); printf("整数を入力してください-->"); scanf("%i", &i); j = MyInt.show(i); printf("入力したのは「%d」だね\n", j); printf("文字列を入力してください-->"); scanf("%s", str); strx = MyStr.show(str); printf("入力したのは「%s」だね\n", strx); return 0; }
さて、今回のような使い方ではクラステンプレートのありがたさはあまり わかりません。いろいろプログラムを作って試してみてください。
Update Jul/10/2000 By Y.Kumei