Как создать собственный собственный stream / streambuf?
В образовательных целях я хочу создать буфер streamа и streamа:
- исправить endians при выполнении << myVar;
- хранить в контейнере deque вместо использования std: cout или записывать в файл
- регистрировать дополнительные данные, например, сколько раз я делал <<, сколько раз я делал .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 (что ему нужно для наследования и т. д.)?
- Является ли Int32.ToString () специфичным для культуры?
- Как сделать тип значения nullable с помощью .NET XmlSerializer?
- Как я могу перечислить все процессы, запущенные в Windows?
- Получение ServiceStack для сохранения информации о типе
- Воспроизведение словаря из IEnumerable <KeyValuePair >
- Как автоматически генерировать файл classа C # из строки объекта JSON
- Почему быстрее обрабатывать отсортированный массив, чем несортированный массив?
- Как автоматически отображать все свойства classа и их значения в строке?
- Зачем переходить по ссылке const вместо значения?
- C # - Как проверить, существует ли в C # пространство имен, class или метод?
- Каков алгоритм преобразования буквы столбца Excel в его номер?
- Создание ссылки для загрузки в файл на файловом сервере
- Последовательность не содержит элементов?
Канонический подход состоит в определении вашего собственного 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
. (И сколько звонков в <<
должны ли они считаться?)