独自の ostream/streambuf を作成するにはどうすればよいですか?
質問
教育目的で、次のことを行うための ostream と stream バッファーを作成したいと考えています。
- << myVar; を実行するときにエンディアンを修正します。
- std:cout を使用したりファイルに書き込んだりする代わりに、DEQUE コンテナーに保存します。
- << を実行した回数、.write を実行した回数、書き込んだバイト数、flush() を実行した回数などの追加データをログに記録します。しかし、すべての情報が必要なわけではありません。
オーバーロードを試みましたが、ひどく失敗しました。して書き込みをオーバーロードしてみました
ostream& write( const char* s, streamsize n )
私のbasic_stringstream2クラスでは(basic_stringstreamをcppファイルにコピー&ペーストして変更しました)、コードはbasic_ostreamを使用し続けました。コードを調べたところ、xsputn をオーバーロードする必要があるようです (このページでは触れていません) http://www.cplusplus.com/reference/iostream/ostream )しかし他に何をオーバーロードする必要があるのでしょうか?また、クラスを構築するにはどうすればよいですか (何を継承する必要があるかなど)。
解決
正規のアプローチは、独自の streambuf を定義することで構成されます。以下をご覧ください。
- アンジェリカ・ランガーの記事 IOStreams の派生について
- ジェームス観世さんの記事 streambuf のフィルタリングについて
- boost.iostream 応用例としては
他のヒント
A+C の場合)ファセットを検討する必要があると思います。ファセットは、オブジェクトが文字として書き込まれる方法を変更します。オブジェクトをストリーミングした回数に関する統計もここに保存できます。チェックアウト STL ストリームを使用するときに独自のオブジェクトをフォーマットするにはどうすればよいですか? たとえば。
B) 独自の streambuf を作成し、ostream をそのバッファ (コンストラクター引数) に接続する必要があります。見る リュックさんのリンク + 新しい streambuf クラスの派生。つまり、ostream (最低限) に対してこれを実装する必要があります。
私は何がやりたいことは可能であることはよく分かりません。 <<
事業者は、仮想ではありません。だから、あなたはエンディアン変換とカウントしてやりたいyourstream &operator << (yourstream &strm, int i)
を定義することができ、そして、あなたのコードは、直接それを呼び出したときにそれが動作します。あなたがのostreamを期待する関数への呼び出しの<<
機能いつでもyourstreamオブジェクトを渡す場合しかし、それは代わりに、あなたのオリジナルのostreamのバージョンになります。
、ストリーム施設が設定されている、とあなたは非常に簡単にすることができます<<
経由で独自のクラスを出力するためのサポートを追加します。私はあなたがそれらの間の中間層を再定義することができるように意図されているとは思わない。
そして特に、<<
インタフェースの全体のポイントは、あなたが実際にバイナリ出力をしたいのように聞こえるが、きれいにフォーマットテキスト出力を提供することです。 (それ以外の場合は「エンディアン」への言及は意味をなさない。)であっても、私は、それが最高の状態で厄介なバイナリ出力を生成します知らないこれを行うにはいくつかの方法があると仮定します。例えば、出力する3D空間内の点を、エンドユーザーの過負荷を考慮してください。 <<
のエンドユーザーのバージョンは、おそらく<< '(' << x << ", " << y << ", " << z << ')'
ような何かをします。これは、テキストストリームに素敵に見えますが、それは理想的なだけで<< x << y << z
を使用するバイナリストリーム、で浪費し、完全に役に立たない文字がたくさんあります。 (そして、どのように多くの<<
への呼び出し、それらとしてカウントすべきか?)