Стандартный выходной поток no-op
Есть ли способ создать экземпляр ostream, который в основном ничего не делает?
Например:
std::ostream dummyStream(...);
dummyStream << "Nothing will be printed";
Я мог бы просто создать ostringstream, но данные будут буферизованы (и я действительно не хочу ничего с ними делать, поэтому он добавляет бесполезные накладные расходы).
Любая идея?
[edit] Найдите этот связанный вопрос, который соответствует моим потребностям. Тем не менее, я думаю, было бы полезно иметь ответ, говорящий о том, как создать допустимый (без ошибок) выходной поток со стандартным С++.
Ответы
Ответ 1
Вам нужен пользовательский streambuf.
class NullBuffer : public std::streambuf
{
public:
int overflow(int c) { return c; }
};
Затем вы можете использовать этот буфер в любом классе ostream
NullBuffer null_buffer;
std::ostream null_stream(&null_buffer);
null_stream << "Nothing will be printed";
streambuf::overflow
- это функция, вызываемая, когда буфер должен выводить данные в фактический пункт назначения потока. Класс NullBuffer
выше ничего не делает, когда вызывается переполнение, поэтому любой поток, использующий его, не будет выводить результат.
Ответ 2
Если это отключить вывод журнала, ваш dummyStream
все равно приведет к оценке аргументов. Если вы хотите минимизировать влияние при отключении журнала, вы можете полагаться на условное выражение, например:
#define debugStream \
if (debug_disabled) {} \
else std::cerr
Итак, если у вас есть код вроде:
debugStream << "debugging output: " << foo() << std::endl;
Никакие аргументы не будут оцениваться, если debug_disabled
истинно.
Ответ 3
Основной метод для новых классов потоков:
- Вывести класс из
std::streambuf
;
- Переопределить виртуальные функции в этом классе. Здесь и происходит настоящая работа. В вашем случае пустые реализации должны быть достаточно хорошими.
- Вывести класс из
std::ostream
с одним членом, вашим классом streambuf.
- Конструктор вашего streamclass должен перенаправить указатель на этот член в базовый конструктор std:: ostream.
Я боюсь, что вы не избавитесь от шага форматирования.
Надеюсь, это даст вам несколько указателей; У меня нет времени, чтобы развернуть это в полный ответ, извините.
Обновить. Подробнее см. john.