Как я могу построить Filter_streambuf на основе Basic_streambuf?
У меня есть проект, который требует, чтобы я вставил фильтр в поток, чтобы исходящие данные были изменены в соответствии с фильтром. После некоторых исследований мне кажется, что я хочу создать фильтр Filter_streambuf следующим образом:
template <class StreamBuf>
class filtered_streambuf: public StreamBuf
{ ... }
А затем вставить filtered_streambuf<>
в любой поток мне нужно отфильтровать. Моя проблема в том, что я не знаю, какие инварианты мне нужно поддерживать при фильтрации потока, чтобы гарантировать, что
- Производные классы могут работать как положено. В частности, я могу обнаружить, что фильтр Filter_streambufs построен на основе других фильтров Filter_streambuf.
- Все различные потоковые вставки, экстракторы и манипуляторы работают как положено.
Проблема в том, что я просто не могу понять, какой минимальный интерфейс я должен предоставить, чтобы гарантировать, что iostream будет иметь то, что ему нужно для правильной работы.
В частности, нужно ли имитировать перемещение защищенных переменных-указателей или нет? Нужен ли мне поддельный буфер данных или нет? Могу ли я просто переопределить публичные функции, переписав их с точки зрения базового потокового буфера, или это слишком упрощенно?
1 ответ
Boost.Iostreams могут быть полезны для вас.
Из документации:
Boost.Iostreams преследует три цели:
- Для упрощения создания стандартных потоков C++ и потоковых буферов для доступа к новым источникам и приемникам.
- Обеспечить основу для определения фильтров и присоединения их к стандартным потокам и потоковым буферам.
- Предоставить коллекцию готовых к использованию фильтров, источников и приемников.
Я сам почти не использовал эту библиотеку, поэтому не могу комментировать дальше.