Расширение C++ ostream

Я пытаюсь узнать больше о работе библиотеки потоков ввода-вывода C++, расширив std:: потокбаф. В качестве обучающего эксперимента моя цель — просто создать собственный поток, который направляет весь вывод на std::cerr. Это кажется достаточно простым:

#include 
using namespace std;

class my_ostreambuf : public std::streambuf
{
    public:

    protected:

    std::streamsize xsputn(const char * s, std::streamsize n)
    {
        std::cerr << "Redirecting to cerr: " << s << std::endl;
        return n;
    }

};

int main()
{
    my_ostreambuf buf;
    std::ostream os(&buf);
    os << "TEST";
}

Кажется, это работает, так как печатает Redirecting to cerr: TEST. Проблема в том, что он не работает, когда одиночный символ(в отличие от строки) вставляется в поток через std::ostream::sputc]. Например:

int main()
{
    my_ostreambuf buf;
    std::ostream os(&buf);
    os << "ABC"; // works
    std::string s("TEST");
    std::copy(s.begin(), s.end(), std::ostreambuf_iterator(os)); // DOESN'T WORK
}

Я думаю, проблема в том, что xsputnне поддерживает вставку одиночных символов. (Наверное, sputcне вызывает xsputnвнутри?) Но, просматривая список виртуальных защищенных функцийв std::streambuf, я не вижу никакой функции, которую я должен переопределить, которая обрабатывает вставку одного символа.

Итак, как мне это сделать?

5
задан Channel72 6 June 2012 в 20:30
поделиться