LINUX.ORG.RU

История изменений

Исправление 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.

Тогда эти манипуляторы будут не нужны…