这是一个示例C ++代码
ostream& log = cout;
ostream& getLog() { return log; }
// somewhere in code
getLog() << "Message";
执行此代码时,将打印“消息”。
问:丢弃这些邮件的最简单方法是什么(不打印,不保存)?客户端仍然必须使用getLog
,但可能会返回一些吞下所有消息的模拟输出流...
答案 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);
如果未定义DEBUG
,DBG
中的所有内容都将被删除(并且不会再花费任何CPU周期)