2005年02月26日

basic_filterbuf用ostreamクラス

以前の記事でbasic_streambufの派生クラスであるbasic_filterbufクラスを作成しました。

しかし、アプリケーションから直接basic_streambuf派生クラスを扱うのはあまりよろしくない気がします。アプリケーションからばbasic_ostream派生クラスなりbasic_istream派生クラスだけを扱うべきだと思います。なんとなく今のC++標準ライブラリからそんなポリシーを感じるためです。

というわけで、アプリケーションからbasic_filterbufの存在を隠すためのbasic_ostreamの派生クラスを作ってみました。

template <class Elem, class Tr = std::char_traits<Elem> >
class basic_ofilterstream : public std::basic_ostream<Elem, Tr>
{
public:
  explicit basic_ofilterstream(basic_filterbuf<Elem, Tr>* _Buffer, bool _DeleteBuffer, std::basic_ostream<Elem, Tr>* _Stream, bool _Delete = false)
  : std::basic_ostream<Elem, Tr>(_Buffer), _buffer(_Buffer), _delete_buffer(_DeleteBuffer), _stream(_Stream), _delete(_Delete)
  {
  }
  virtual ~basic_ofilterstream(void)
  {
    if (_delete) {
      delete _stream;
    }
    if (_delete_buffer) {
      delete _buffer;
    }
  }
private:
  basic_filterbuf<Elem, Tr>* _buffer;
  bool _delete_buffer;
  std::basic_ostream<Elem, Tr>* _stream;
  bool _delete;
};

このクラスも派生させて初めて役に立つクラスです。 派生クラスのコンストラクタはこんな感じになります。

explicit basic_oxxxstream(std::basic_ostream<Elem, Tr>* _Stream, bool _Delete = false)
: basic_ofilterstream<Elem, Tr>(new basic_xxxbuf<Elem, Tr>(_Stream->rdbuf()), true, _Stream, _Delete)
{
}

basic_xxxbufというのは、basic_filterbufの派生クラスです。

basic_oxxxstreamのコンストラクタの引数を見て頂きたいのですが、引数がbasic_ostreamクラスへのポインタになっており、basic_streambufクラス及びその派生クラスを引数に取らなくなっています。
これでこうしたアプリケーションからはbasic_streambufを扱わなくて済む、というわけです。

今回作成したのは出力用クラスですが、入力用クラスもほぼ同様に作れると思いますので必要に応じて(必要な方はいないと思いますが)作ってみて下さい。

投稿者 MASATO : 2005年02月26日 00:13 | トラックバック
コメント
コメントする









名前、アドレスを登録しますか?