2

这是一个示例 C++ 代码

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

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

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

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

4

3 回答 3

6

你可以做以下恐怖:

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

将null 传递给 的构造函数ostream将设置badbit标志并因此丢弃所有写入。

于 2013-02-18T07:30:12.213 回答
1

有一个类似的帖子试图这样做- 模拟重定向到的 cpp 方式/dev/null

实施起来容易吗?

是的。从 std::streambuf 派生一个类并覆盖受保护的虚函数溢出,如下所示

int溢出(int c){返回c;}

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

于 2013-02-18T07:26:18.130 回答
0

快速脏:

定义一个派生自 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 周期)

于 2013-02-18T07:44:56.607 回答