2011-10-08 58 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