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

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

  1. исправить endians при выполнении << myVar;
  2. хранить в контейнере deque вместо использования std: cout или записывать в файл
  3. регистрировать дополнительные данные, например, сколько раз я делал <<, сколько раз я делал .write, количество байтов, которые я написал, и сколько раз я сбрасывал (). Но мне не нужна вся информация.

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

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

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

Канонический подход состоит в определении вашего собственного streambuf. Вы должны посмотреть:

  • Статьи Анжелики Лэнгер о выпуске IOStreams
  • Статьи Джеймса Канзе о фильтрации streamов
  • boost.iostream для примеров применения

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

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

  • переполнение (поместить один буфер или буфер буфера) ( ссылка )
  • xsputn (помещает массив символов в буфер) ( ссылка )
  • синхронизация ( ссылка )

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

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

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

  • Есть ли ограничение, которое ограничивает мой общий метод численными типами?
  • Прикрепите файл из MemoryStream к MailMessage в C #
  • указатель указателя в связанном списке добавить
  • Почему C ++ не упрощает структуру?
  • Качество сохраненного JPG в C #
  • FindAll vs Где метод расширения
  • Как #include работает в C ++?
  • Домен верхнего уровня из URL-адреса в C #
  • Передайте строку соединения кодовому первому DbContext
  • Почему это чтение cin заклинило?
  • Реализация C ++ 14 make_integer_sequence
  • Interesting Posts
    Давайте будем гением компьютера.