以前の記事で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 | トラックバック