Самое простое решение - просто вывести в неоткрытое std::ofstream
(или любой другой поток вывода в состоянии ошибки).Это приведет к тому, что поток будет постоянно находиться в состоянии ошибки.Это может быть преимуществом (операторы <<
будут пропускать форматирование), но если какой-либо код, который вы не можете контролировать, проверяет ошибки и делает что-то конкретное, если они возникают, у вас, вероятно, будут проблемы.
В противном случае довольно просто реализовать нулевой поток;единственная функция streambuf
, которую вы действительно должны переопределить, это overflow
.Что-то вроде следующего должно сделать трюк:
class NulStreambuf : public std::streambuf
{
char dummyBuffer[64];
protected:
virtual int overflow( int c )
{
setp( dummyBuffer, dummyBuffer + sizeof( dummyBuffer ) ) ;
return (c == EOF) ? '\0' : c ;
}
};
(Буфер избегает некоторых ненужных вызовов виртуальных функций. На некоторых платформах это имеет существенное значение.)
Затем создайте выводstream, который его использует:
class NulOStream : public NulStreambuf, public std::ostream
{
public:
NulOStream() : std::ostream( this ) {}
};
(Использование наследования, а не сдерживания гарантирует, что streambuf полностью создан перед передачей в ostream
. На практике это обычно не требуется, нопохоже, что стандарт не разрешает передавать еще не сконструированный streambuf
в конструктор ostream
.)