На самом деле, есть способ, но в этом случае, только благодаря тому, что базовые классы напрямую используют поток std :: cout. Одним из возможных решений является наследование класса std :: streambuf следующим образом:
#include <iostream>
#include <streambuf>
class DummyStreambuf : public std::streambuf {};
Этот шаг необходим, потому что конструктор std :: streambuf защищен. Если у вас есть DummyStreambuf (или как вы его называете), все, что вам нужно сделать, это изменить буфер потока на стандартный поток std :: cout.
int main()
{
DummyStreambuf dummy;
std::cout << "test" << std::endl;
// save default stream buffer for later use
std::streambuf *buff = std::cout.rdbuf(&dummy);
// this line shouldn't print
std::cout << "test" << std::endl;
// restore default stream buffer
std::cout.rdbuf(buff);
std::cout << "test" << std::endl;
}
Конечно, здесь есть место для улучшения. Вы можете написать простой синглтон, который может включать и выключать вывод std :: cout. Вот одна из возможных реализаций однопоточной среды:
#include <iostream>
#include <streambuf>
class DummyStreambuf : public std::streambuf {};
class CoutSwitch
{
private:
DummyStreambuf _dummyBuf;
std::streambuf *_coutBuf;
CoutSwitch() : _coutBuf( std::cout.rdbuf() ) {}
static CoutSwitch &instance() {
static CoutSwitch _instance;
return _instance;
}
public:
static void turnOn() {
std::cout.rdbuf( instance()._coutBuf );
}
static void turnOff() {
std::cout.rdbuf( &instance()._dummyBuf );
}
};
int main()
{
std::cout << "test" << std::endl;
CoutSwitch::turnOff();
std::cout << "test" << std::endl;
CoutSwitch::turnOn();
std::cout << "test" << std::endl;
}