У меня есть функция, которая отправляет вещи на std::ostream
.Примерно так:
void f(std::ostream& oss) {
oss << "Hello world!";
}
Теперь я хотел бы создать свой собственный класс, производный от std::ostream
, который будет анализировать исходящий текст и изменять его, чтобы он выводил «Ola world!», Дляпример.
class StreamConverted : public std::ostream {
...
};
Я считаю (я не слишком опытен в управлении потоками), что мне придется «поиграть» с базовым rdbuf()
потока, поэтому мне придется заменить rdbuf
std::ostream
с моим.
MyStreamBuf m_my_streambuf;
std::ostream& m_original_stream
std::streambuf* m_original_streambuf;
public:
StreamConverted(std::ostream& os)
: m_original_stream(os)
, m_original_streambuf(os.rdbuf(&m_my_streambuf))
{}
(Пожалуйста, простите мне любые очевидные ошибки или опечатки. Я пишу все это в полете. Я бы также добавил деструктор для восстановления исходного потокового буфера.)
Это приводит меня к необходимости написать мой MyStreamBuf
, который будет получен из std::streambuf
class MyStreamBuf : public std::streambuf {
};
И вот наступает момент, когда мне нужен совет.
Должен ли я создать свой собственный буфер, вызвав std::streambuf::setp(begin, end)
, а затем переписать метод overflow()
, чтобы проанализировать содержимое буфера при его вызове, а затем отправить данные в исходный поток буферов после некоторого разумногоспособ преобразитьбуфер?
Я не уверен, зайду ли я далеко с изменением буфера вместо того, чтобы что-то делать с ostream
...
Любой совет?