iostreamの継承方法(C++技術メモ)2

basic_streambuf のクラスの使い方

iostreamの継承方法(C++技術メモ)1:http://sato-si.at.webry.info/200502/article_5.html のつづき

さて,basic_streambuf の使い方だが,継承をすることで使用できる。
しかし,このひと,入力出力兼用バッファクラスだったりする。
ちなみに,入力専用,出力専用,入出力兼用の切り替えは継承するクラスで決めることになる。

それらのクラスを使う方法だが,直接使うことは無い。というか,直接使えない。

入力専用ならbasic_istreamを継承したクラスを作成する。
出力専用ならbasic_ostreamを継承したクラスを作成する。
入出力兼用ならbasic_iostreamを継承したクラスを作成する。
これらのクラスは,コンストラクタで, 新しく作った basic_streambufを継承したクラスをnewして
継承もとのクラスのコンストラクタの引数に渡すだけである。

basic_streambufを継承して,自分のストリームバッファを作る
例えば,basic_mystreambuf とか
で,これを使えるようにするには,basic_mystreambuf が 入出力両用だったら,

template<class E, class T = char_traits<E> >
class basic_iomystream : public basic_iostream< E, T >
{
public:
  basic_iomystream() : basic_iostream< E, T >(new basic_mystreambuf< E, T >) {}
  virtual ~basic_iomystream() {}
};

typedef basic_iomystream<char, char_traits<char> > iomystream;
typedef basic_iomystream<wchar_t, char_traits<wchar_t> > wiomystream;

と書いてあげれば cout や cin と同様に
int n;
iomystream m;
m << "OK";
m >> n;
と かかけるようになる。

一見 ややこしそうに見えるが,実際のところ,これは定型文で,
次の部分を入れ替えてやればOK
basic_iomystream は,使うときのクラスの頭にbasic_をつけたもの
iomystreamや wiomystream が実際に使うときのクラス名。
  iomystream は 標準の char型の入出力。
  wiomystream は 頭に,wがついただけで,wchar_t型の入出力。(UNICODEを使いたい場合)
basic_mystreambuf が本体のクラス。実際のストリームのコードをここに
記述するクラス名となる。


おっと,忘れていたが,継承元のクラスを使うには,
#include <iostream>
using namespace std;
というものを 頭につけると使えるようになる。

なお,Visual C++のデバッグ情報付きコンパイルでは,警告メッセージが出ることがある。
(デバッグ情報の文字数の255文字を軽く超える警告が出る)


今回はここまで。

この記事へのコメント

この記事へのトラックバック