自己的输出流(模拟cout)

时间:2013-02-18 07:21:30

标签: c++ io std ostream

这是一个示例C ++代码

ostream& log = cout;
ostream& getLog() { return log; }

// somewhere in code
getLog() << "Message";

执行此代码时,将打印“消息”。

问:丢弃这些邮件的最简单方法是什么(不打印,不保存)?客户端仍然必须使用getLog,但可能会返回一些吞下所有消息的模拟输出流...

3 个答案:

答案 0 :(得分:6)

你可以做以下恐怖事件:

ostream nullstream(0);
ostream& log = nullstream;

将null传递给ostream的构造函数将设置badbit标志,从而丢弃所有写入。

答案 1 :(得分:1)

similar post that attempts to do this - 模仿重定向到/dev/null的cpp方式

  
    

实施一个是否容易?

  
     

是。从std :: streambuf派生一个类并覆盖protected   虚函数溢出如下

     

int overflow(int c){return c; }

     

然后,您可以使用标准istream并将其流缓冲区设置为   使用rdbuf的streambuf类的实例。或者你可以定义你的   自己派生的ostream类,它自动使用一个实例   你的streambuf课程。

答案 2 :(得分:0)

快点肮脏:

定义一个派生自std :: ostream的类,并为任何无效的T实现<<运算符。

不幸的是,在某些情况下这可能不起作用:<<中的std::ostream运算符不是多态的(非虚拟的),因此只有在流类型时才会调用被覆盖的<<yourstream&而不是std::ostream&

更有礼貌

派生std::streambuf,其中包含一个没有缓冲区的类,并且覆盖 overlflow 始终返回0

然后创建一个与该缓冲区关联的std::ostream,并从getLog()返回它;

这将让ostream发挥作用:将值转换为文本并将字符发送到缓冲区。缓冲区只会吃它们而不做任何事情。

对图书馆的礼貌,不是那么有效,是任何情况下调用的ostream值到文本的例程。

效率最高

是对日志记录语句进行编译:比如

#ifdef DEBUG
#define DBG(x) x
#else
#define DBG(x)
#endif

// Your entire code here

#undef DBG

并将记录编写为

DBG(std::cout << logging_variables_and_text << std::endl);

如果未定义DEBUGDBG中的所有内容都将被删除(并且不会再花费任何CPU周期)