这是一个示例 C++ 代码
ostream& log = cout;
ostream& getLog() { return log; }
// somewhere in code
getLog() << "Message";
执行此代码时,将打印“消息”。
问:丢弃这些消息的最简单方法是什么(不打印,不保存)?getLog
客户端仍然必须使用,但可能会返回一些吞下所有消息的模拟输出流......
你可以做以下恐怖:
ostream nullstream(0);
ostream& log = nullstream;
将null 传递给 的构造函数ostream
将设置badbit
标志并因此丢弃所有写入。
有一个类似的帖子试图这样做- 模拟重定向到的 cpp 方式/dev/null
实施起来容易吗?
是的。从 std::streambuf 派生一个类并覆盖受保护的虚函数溢出,如下所示
int溢出(int c){返回c;}
然后,您可以使用标准 istream 并将其流缓冲区设置为使用 rdbuf 的 streambuf 类的实例。或者,您可以定义自己的派生 ostream 类,该类会自动使用您的 streambuf 类的实例。
快速脏:
定义一个派生自 std::ostream 的类,并为什么<<
都不做的任何 T 实现运算符。
不幸的是,这在某些情况下可能不起作用:<<
运算符 instd::ostream
不是多态的(不是虚拟的),因此只有当流类型是而不是<<
时才会调用您的覆盖。yourstream&
std::ostream&
更有礼貌:
派生std::streambuf
,具有没有缓冲区的类,并且通过始终返回 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 周期)