Написание фильтра ostream?
Я хотел бы написать простую ostream
который оборачивает аргумент ostream
и каким-то образом изменяет поток перед передачей его потоку аргументов. Преобразование - это нечто простое, например, смена буквы или стирание слова.
Что бы простой класс наследовал от ostream
выглядит как? Какие методы я должен переопределить?
3 ответа
std::ostream
не лучшее место для реализации фильтрации. Он не имеет соответствующих виртуальных функций, чтобы позволить вам сделать это.
Вы, вероятно, хотите написать класс, производный от std::streambuf
содержащий завернутый std::ostream
(или завернутый std::streambuf
), а затем создать std::ostream
используя это std::streambuf
,
std::streambuf
имеет виртуальную функцию overflow
которую вы можете переопределить и использовать для изменения байтов перед передачей их в обернутый выходной класс.
Я всегда думал, что написание специализированных потоков - неправильный подход почти к любой проблеме. Выходной поток обычно является конечной точкой в вашей программе - любая обработка данных должна выполняться задолго до того, как вы попадете в сам поток. Точно так же для входных потоков - размещение интеллекта, необходимого для (скажем) анализа входных данных в потоке, помещает его в неправильное место. Просто мои 2 цента, конечно.