Принципиально согласился с Нилом.
Вы хотите изменить поведение буфера, потому что это единственный способ расширить iostreams. endl
делает это:
flush(__os.put(__os.widen('\n')));
widen
возвращает один символ, поэтому вы не можете вставить туда свою строку. put
вызывает putc
, который не является виртуальной функцией и лишь изредка подключается к overflow
. Вы можете перехватить на flush
, который вызывает буфер 1011 *. Вам нужно будет перехватить и изменить все символы новой строки, как они overflow
ed или вручную sync
ed, и преобразовать их в вашу строку.
Создание класса переопределенного буфера проблематично, поскольку basic_streambuf
ожидает прямой доступ к своей буферной памяти. Это предотвращает простую передачу запросов ввода-вывода к существующему basic_streambuf
. Вам нужно выйти на конечность и предположить, что вы знаете класс потокового буфера, и наследовать его. (Насколько я могу судить, cin
и cout
не гарантированно используют basic_filebuf
.) Затем просто добавьте virtual overflow
и sync
. (См. §27.5.2.4.5 / 3 и 27.5.2.4.2 / 7.) Для выполнения замены может потребоваться дополнительное пространство, поэтому будьте осторожны, чтобы выделить это заранее.
- ИЛИ -
Просто объявите новый endl
в своем собственном пространстве имен или, что лучше, манипулятором, который вообще не называется endl
!