Вы действительно не хотите перегружать std::stringbuf
, вы хотите перегрузить std::streambuf
или std::basic_streambuf
(если вы хотите поддерживать несколько типов символов), также вам необходимо переопределить метод переполнения.
Но я также думаю, что вам нужно переосмыслить решение вашей проблемы.
cout
- это просто ostream
, поэтому, если все классы / функции принимают ostream
, вы можете передать все, что захотите. например cout
, ofstream
и т. Д.
Если это слишком сложно, я бы создал свою собственную версию cout
, возможно, под названием mycout
, которую можно определить во время компиляции или во время выполнения (в зависимости от того, что вы хотите сделать).
Простое решение может быть:
#include <streambuf>
#include <ostream>
class mystream : public std::streambuf
{
public:
mystream() {}
protected:
virtual int_type overflow(int_type c)
{
if(c != EOF)
{
char z = c;
mexPrintf("%c",c);
return EOF;
}
return c;
}
virtual std::streamsize xsputn(const char* s, std::streamsize num)
{
mexPrintf("*s",s,n);
return num;
}
};
class myostream : public std::ostream
{
protected:
mystream buf;
public:
myostream() : std::ostream(&buf) {}
};
myostream mycout;
И версия cout может быть просто:
typedef std::cout mycout;
Версия во время выполнения немного сложнее, но легко выполнима.