其实,有一种方法,但在这种情况下,只能感谢基类直接使用std :: cout流。一个可能的解决方案是继承的std ::流缓冲类是这样的:需要
#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 2010-12-06 14:57:51