10

現在、stringbuf のサブクラスを実装して、バッファーが特定の文字 (私の場合は '\n') をトークン化し、この文字が発生した場合にアクションを実行できるようにしようとしています (メッセージをロガーにダンプし、後でバッファーをクリアします)場合)。この目標を達成するために、sputc ('\n' に注意する機能を実装するため) と xsputn (実際に sputc を使用するため、GCC 実装はデフォルトでこれを行うようには見えないため) をオーバーライドしました。デバッグの目的で、sputc に渡された各文字を stdout に書き出すようにしました。

これが私の質問です。次のようなものを使用する場合

mystream << "Some text" << std::endl;

sputc は、std::endl によって導入される必要がある '\n' を除く各文字を受け取るため、'\n' が渡されないため、期待されるアクションは実行されません。次のようなものを使用すると

mystream << "Some text" << '\n';

あるいは

mystream << "Some text" << "\n" << std::flush;

すべてが期待どおりに機能し、私の sputc 実装は '\n' 文字を取得します。

したがって、私の質問は次のとおりです。両方のコード行が背後のstringbufに関してまったく同じことを行うべきではありませんか?そうでない場合、「\ n」を取得するためにオーバーライドする必要がある他のメソッドはどれですか?

4

1 に答える 1

6

は仮想ではないsputcため、オーバーライドできません。保留中のシーケンス全体をオーバーロードして調べるsputc必要があります。overflowsync\n

xsputnストリーム タイプをサポートするデバイスについて何か特別なことを知っているため、最適なことができない限り、オーバーロードする必要はありません。

于 2011-06-13T13:48:49.353 に答える