преобразование текста, отправленного в std :: ostream - PullRequest
0 голосов
/ 01 июня 2018

У меня есть функция, которая отправляет вещи на std::ostream.Примерно так:

void f(std::ostream& oss) {
    oss << "Hello world!";
}

Теперь я хотел бы создать свой собственный класс, производный от std::ostream, который будет анализировать исходящий текст и изменять его, чтобы он выводил «Ola world!», Дляпример.

class StreamConverted : public std::ostream {
...
};

Я считаю (я не слишком опытен в управлении потоками), что мне придется «поиграть» с базовым rdbuf() потока, поэтому мне придется заменить rdbufstd::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 ...

Любой совет?

...