web-dev-qa-db-ja.com

独自のostream / streambufを作成するにはどうすればよいですか?

教育目的で、ostreamとストリームバッファを作成して次のことを行います。

  1. << myVarを実行するときにエンディアンを修正します。
  2. std:coutを使用したり、ファイルに書き込んだりする代わりに、dequeコンテナに格納します
  3. <<を実行した回数、.writeを実行した回数、書き込んだバイト数、flush()を実行した回数などの追加データをログに記録します。しかし、私はすべての情報を必要としません。

オーバーロードを試みましたが、ひどく失敗しました。書き込みをオーバーロードしてみました

ostream& write( const char* s, streamsize n ) 

basic_stringstream2クラス(basic_stringstreamの貼り付けをcppファイルにコピーして変更しました)でしたが、コードはbasic_ostreamを使用し続けました。コードを調べたところ、xsputnをオーバーロードする必要があるようです(このページでは言及されていません http://www.cplusplus.com/reference/iostream/ostream )が、他に何をしますかオーバーロードする必要がありますか?クラスを作成するにはどうすればよいですか(継承する必要があるものなど)?

23
user34537

標準的なアプローチは、独自のstreambufを定義することです。あなたは見ておくべきです:

24
Luc Hermitte

A + Cの場合)ファセットを確認する必要があると思います。ファセットは、オブジェクトが文字として書き込まれる方法を変更します。オブジェクトをストリーミングした回数に関する統計もここに保存できます。例として STLストリームを使用するときに自分のオブジェクトをフォーマットする方法は? をチェックしてください。

B)の場合、独自のstreambufを作成し、ostreamをそのバッファーに接続する必要があります(コンストラクター引数)。 Lucのリンク + 新しいstreambufクラスの派生 を参照してください。要するに、ostream(最小)に対してこれを実装する必要があります:

  • オーバーフロー(単一の文字またはフラッシュバッファを配置)( リンク
  • xsputn(char配列をバッファに配置)( link
  • 同期( リンク
6
mandrake

あなたがやりたいことが可能かどうかはわかりません。 _<<_演算子は仮想ではありません。したがって、yourstream &operator << (yourstream &strm, int i)を定義して、エンディアン変換とカウントで必要な処理を実行できます。これは、コードが直接呼び出すときに機能します。ただし、ostreamを期待する関数にyourstreamオブジェクトを渡すと、その関数が_<<_を呼び出すたびに、元のostreamバージョンではなく元のostreamバージョンになります。

私が理解しているように、ストリーム機能は、異なる種類のバッファー(たとえば、charの両端キューなど)を使用する新しいストリームタイプを「簡単に」定義できるように設定されており、のサポートを非常に簡単に追加できます。 _<<_を介して独自のクラスを出力します。それらの間の中間層を再定義できるようにするつもりはないと思います。

特に、_<<_インターフェイスの全体的なポイントは、実際にはバイナリ出力が必要なように聞こえますが、適切にフォーマットされたテキスト出力を提供することです。 (それ以外の場合、「エンディアン」への言及は意味がありません。)これを行う方法があると仮定しても、私にはわかりませんが、せいぜい厄介なバイナリ出力を生成します。たとえば、3D空間にポイントを出力するためのエンドユーザーの過負荷について考えてみます。エンドユーザーバージョンの_<<_は、おそらく<< '(' << x << ", " << y << ", " << z << ')'のようなことをします。これはテキストストリームでは見栄えがしますが、バイナリストリームでは多くの無駄で完全に役に立たない文字であり、理想的には_<< x << y << z_を使用するだけです。 (そして、_<<_への呼び出しはいくつカウントする必要がありますか?)

1
Sol