第36章 クラステンプレート その1


前章では関数テンプレートをやりました。 クラステンプレートもこれとにています。しかし、ちょっと面倒なこともあります。



まずは、どのような形式で書くかを解説します。テンプレート自体比較的 新しい機能なので、これをサポートしていない処理系があるかもしれません。

template <typename T,...> class ClassX { ... };

と、こんな感じになります。使うときはTの所に任意のデータ型が来ることになります。 さて、メンバ関数をクラス外で定義するときは、

template <typename T> class ClassX { public: T func(T); }; template <typename T> T ClassX <T> :: func(T x) { .... }

のようになります。< >で囲まれたリストを忘れやすいので注意してください。

では、サンプルを作ってみましょう。これはユーザーがいろいろなタイプの データを入力するのでそれをそのまま返すものです。(意味のないプログラムです)

// 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; }

メンバ関数のshowは引数をそのまま返すだけのもっとも単純な関数です。
クラス名+<引数リスト>を一つのクラスと考えるとわかりやすいかもしれません。

実行結果は左のようになります。



では、同じプログラムをメンバ関数をクラス内で記述するとどうなるでしょうか。

// 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; }

クラス内でメンバ関数の記述を行うと少し簡単になりました。

さて、今回のような使い方ではクラステンプレートのありがたさはあまり わかりません。いろいろプログラムを作って試してみてください。


[C++Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Jul/10/2000 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。