История изменений
Исправление fsb4000, (текущая версия) :
В С++20 добавили thread_safe обёртки над потоками.
https://en.cppreference.com/w/cpp/io/basic_osyncstream
Они обычно передают данные в деструкторе. Или когда делают emit.
(захватывают mutex и безопасно передают данные в родительский буфер)
fflush они откладывают.
Но это можно изменить.
synced_out.rdbuf()->set_emit_on_sync(true);
Но эти basic_osyncstream наследуются от обычных basic_ostream.
И их можно передавать в функции, которые ждут basic_ostream.
Но у basic_ostream.rdbuf() нет метода set_emit_on_sync.
Поэтому есть манипуляторы:
out << std::emit_on_flush;
out << std::noemit_on_flush
Они не делают ничего, если это обычный basic_ostream.
И делают
out.rdbuf()->set_emit_on_sync(true);
out.rdbuf()->set_emit_on_sync(false);
если out это basic_osyncstream.
Вот для этого и нужен dynamic_cast.
Но да.
Возможно пользователю просто нужно делать две функции.
отдельно для basic_ostream (считать, что это не thread_safe)
и отдельно для basic_osyncstream.
Тогда эти манипуляторы будут не нужны…
Исходная версия fsb4000, :
В С++20 добавили thread_safe обёртки над потоками.
https://en.cppreference.com/w/cpp/io/basic_osyncstream
Они обычно передают данные в деструкторе. Или когда делают emit.
(захватывают mutex и безопасно передают данные в родительский буфер)
fflush они игнорируют.
Но это можно изменить.
synced_out.rdbuf()->set_emit_on_sync(true);
Но эти basic_osyncstream наследуются от обычных basic_ostream.
И их можно передавать в функции, которые ждут basic_ostream.
Но у basic_ostream.rdbuf() нет метода set_emit_on_sync.
Поэтому есть манипуляторы:
out << std::emit_on_flush;
out << std::noemit_on_flush
Они не делают ничего, если это обычный basic_ostream.
И делают
out.rdbuf()->set_emit_on_sync(true);
out.rdbuf()->set_emit_on_sync(false);
если out это basic_osyncstream.
Вот для этого и нужен dynamic_cast.
Но да.
Возможно пользователю просто нужно делать две функции.
отдельно для basic_ostream (считать, что это не thread_safe)
и отдельно для basic_osyncstream.
Тогда эти манипуляторы будут не нужны…