실제로이 방법에는 기본 클래스가 std :: cout 스트림을 직접 사용한다는 사실 만 있습니다. 한 가지 가능한 솔루션은 다음과 같이 표준 : streambuf의 클래스를 상속하는 것입니다 : 표준 : streambuf의 생성자가 보호되기 때문에
#include <iostream>
#include <streambuf>
class DummyStreambuf : public 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;
}
고마워,이 최고의 솔루션처럼 보이는데, 나는 정말로 적응 된 생성자 서명을 신경 쓰지 않는다 ... 아주 솔직한 해결책처럼 보인다. – rubenvb