Как я могу построить 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++ и потоковых буферов для доступа к новым источникам и приемникам.
  • Обеспечить основу для определения фильтров и присоединения их к стандартным потокам и потоковым буферам.
  • Предоставить коллекцию готовых к использованию фильтров, источников и приемников.

Я сам почти не использовал эту библиотеку, поэтому не могу комментировать дальше.

Другие вопросы по тегам