Подтвердить что ты не робот

Стандартный выходной поток no-op

Есть ли способ создать экземпляр ostream, который в основном ничего не делает?

Например:

std::ostream dummyStream(...);
dummyStream << "Nothing will be printed";

Я мог бы просто создать ostringstream, но данные будут буферизованы (и я действительно не хочу ничего с ними делать, поэтому он добавляет бесполезные накладные расходы).

Любая идея?

[edit] Найдите этот связанный вопрос, который соответствует моим потребностям. Тем не менее, я думаю, было бы полезно иметь ответ, говорящий о том, как создать допустимый (без ошибок) выходной поток со стандартным С++.

4b9b3361

Ответ 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.