История изменений
Исправление 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
.
Тогда эти манипуляторы будут не нужны…