Подтвердить что ты не робот

Как создать собственный собственный поток/streambuf?

В образовательных целях я хочу создать буфер потока и потока:

  • фиксируют конечные элементы при выполнении < < MYVAR;
  • хранить в контейнере deque вместо использования std: cout или записи в файл
  • записывать дополнительные данные, например, сколько раз я делал < <, сколько раз я делал .write, количество байтов, которые я написал, и сколько раз я сбрасывал(). Но мне не нужна вся информация.

Я пробовал перегружать, но неудачно. Я попытался перегрузить запись, выполнив

ostream& write( const char* s, streamsize n ) 

в моем классе basic_stringstream2 (я скопировал paste basic_stringstream в мой файл cpp и изменил его), но код продолжал использовать basic_ostream. Я просмотрел код, и мне кажется, что мне нужно перегрузить xsputn (который не упоминается на этой странице http://www.cplusplus.com/reference/iostream/ostream), но что еще мне нужно нужно перегружать? и как я могу построить свой класс (что ему нужно для наследования и т.д.)?

4b9b3361

Ответ 2

Для A + C) Я думаю, вы должны посмотреть на грани, они изменяют, как объекты записываются как символы. Вы также можете хранить статистику о том, сколько раз вы передавали свои объекты. Посмотрите Как отформатировать мои собственные объекты при использовании потоков STL? для примера.

Для B) Вам нужно создать свой собственный streambuf и подключить ваш ostream к этому буфере (аргумент конструктора). См. Люк ссылки + Получение новых классов streambuf. Короче, вам нужно реализовать это для ostream (минимум):

  • переполнение (поместите один буфер char или сброс) (ссылка)
  • xsputn (помещает массив char в буфер) (ссылка)
  • sync (ссылка)

Ответ 3

Я не уверен, что то, что вы хотите сделать, возможно. Операторы << не являются виртуальными. Таким образом, вы можете определить yourstream &operator << (yourstream &strm, int i), чтобы делать то, что вы хотите, с преобразованием и подсчетом endian, и оно будет работать, когда ваш код вызывает его напрямую. Но если вы передадите объект yourstream в функцию, ожидающую ostream, в любое время, когда функция вызывает <<, она перейдет к исходной версии ostream вместо вашей.

Как я понимаю, средства потоковой передачи настроены так, что вы можете "легко" определить новый тип потока, который использует другой тип буфера (например, дека символов), и вы можете очень легко добавьте поддержку для вывода собственных классов через <<. Я не думаю, что вы намерены переопределить средний слой между ними.

И в частности, вся точка интерфейса << состоит в том, чтобы обеспечить хорошо отформатированный текстовый вывод, в то время как кажется, что вы действительно хотите двоичный вывод. (В противном случае ссылка на "endian" не имеет смысла.) Даже если предположить, что есть какой-то способ сделать это, я не знаю, в лучшем случае это приведет к неловкому двоичному выходу. Например, рассмотрите перегрузку конечного пользователя для вывода точки в трехмерном пространстве. Версия конечного пользователя <<, вероятно, сделает что-то вроде << '(' << x << ", " << y << ", " << z << ')'. Это будет выглядеть красиво в текстовом потоке, но это много потраченных впустую и полностью бесполезных символов в двоичном потоке, что идеально подходит для использования << x << y << z. (И сколько звонков в << должны ли они считаться?)