私はストリームに'\n'
を書くの意味は、サードパーティのライブラリにstd::endl
/std::flush
を書くとは異なることができると思いことを追加したいと思います。
たとえば、現在のプロジェクトでostreamベースのロガーを使用しています。そのロガーは出力フォーマットにはstd::stringstream
の機能を使用しますが、フラッシングのためのオーバーライドされたマニピュレータを備えています。これにより、フラッシュすることなくログに'\n'
を書き込むことができ、コードを単純化します。
class MyStream
{
// [cut]
std::stringstream m_buffer;
// [cut]
};
// friends:
template <typename Printable>
MyStream& operator<<(MyStream& stream, const Printable& value)
{
stream.m_buffer << value;
}
typedef decltype(std::flush) TManipulator;
template <>
MyStream& operator<<(MyStream& stream, const TManipulator& manipulator)
{
if (manipulator == std::flush || manipulator == std::endl)
stream.sendLogLine();
else
stream.m_buffer << manipulator;
}
// usage sample
void main()
{
getLoggerStream() << "hello" << std::endl;
}
P.S.:ここ
は、擬似コードのサンプルですstd::stringstream
をサブクラス化したくないので、MyStreamはアダプタです。 '\n'
をフラッシングしたい場合は、char*
、std::string
などの機能を実装する必要があります。
これを試しましたか? –
はい、これは実装の詳細なので、明確な答えは得られません。私の推測では、それはほとんどの実装で違いがありますが、これは真実である必要はありません。 –
@Carl - 確かに、私はしなかった、私は方法を知らないだろう。私はその本を読んでいて好奇心が強いので、私は頼むと思った。 –