其實,有一種方法,但在這種情況下,只能感謝基類直接使用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