Написание фильтра ostream?

Я хотел бы написать простую ostream который оборачивает аргумент ostream и каким-то образом изменяет поток перед передачей его потоку аргументов. Преобразование - это нечто простое, например, смена буквы или стирание слова.

Что бы простой класс наследовал от ostream выглядит как? Какие методы я должен переопределить?

3 ответа

Решение

std::ostream не лучшее место для реализации фильтрации. Он не имеет соответствующих виртуальных функций, чтобы позволить вам сделать это.

Вы, вероятно, хотите написать класс, производный от std::streambuf содержащий завернутый std::ostream (или завернутый std::streambuf), а затем создать std::ostream используя это std::streambuf,

std::streambuf имеет виртуальную функцию overflow которую вы можете переопределить и использовать для изменения байтов перед передачей их в обернутый выходной класс.

Рассмотрите возможность использования Boost.Iostreams

Я всегда думал, что написание специализированных потоков - неправильный подход почти к любой проблеме. Выходной поток обычно является конечной точкой в ​​вашей программе - любая обработка данных должна выполняться задолго до того, как вы попадете в сам поток. Точно так же для входных потоков - размещение интеллекта, необходимого для (скажем) анализа входных данных в потоке, помещает его в неправильное место. Просто мои 2 цента, конечно.

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