2011-10-08 41 views
1

我想创建一个C++ ostream对象,只有在条件成立的情况下才输出任何东西以用于调试。最简单的方法是什么?我知道boost有一些简单的类,但是我想知道是否有一种简单的方法可以在没有提升的情况下实现。文档使得它看起来像继承ostream :: sentry将使这成为可能,但我找不到任何消息来源说这是你可以/应该做的事情。有条件输出

回答

6

不要继承,它更容易使用的包装:

class MaybeOstream 
{ 
public: 
    MaybeOstream(std::ostream& stream_) : stream(stream_), bOutput(true) {} 

    void enable(bool bEnable) { bOutput = bEnable; } 

    template<typename T> 
    MaybeOstream& operator<< (T x) 
    { 
     if(bOutput) 
      stream << x; 
     return *this; 
    } 

    // Add other wrappers around ostream: operator void*, good(), fail(), 
    // eof(), etc., which just call through to the ostream 

private: 
    std::ostream& stream; 
    bool bOutput; 
} 
+0

这将需要测试条件(如果条件可能在任何时候都会改变)以及每次使用流时调用“enable”。在这种情况下,可以在每个输出之前使用一个“if”。 – JohnPS

+0

太棒了,谢谢!我不知道你可以用模板做到这一点。这是某种类型推断吗?我应该搜索哪些条款以了解更多信息? (并指出一个小错别字可能会发现这个答案有用:stream(stream)应该是stream(stream_)。如果我在分割段时挠头了)。日志记录类型的情况下,条件将是全局状态。打印的代码并不关心条件是否为假,因为它是在别处设置的。 –

+0

哪个助学班干这个工作? – suresh