3

私はC++の小さなデバッグインライン関数を考えました:

void inline debug( int debug_level, ostream& out ) {
    if ( debug_level <= verbosity ) {
        out.flush();
    }
    else {
        ostream tmp;
        tmp << out;
    }
}

これは私がそれをどのように使いたかったかの例です:

_debug( 7, cout << "Something something" << someint << endl );

ただし、計画どおりに機能しません。詳細レベルが関数に渡されたデバッグレベルよりも高いか等しい場合にのみメッセージを出力したかったのですが、デバッグレベルに関係なく毎回出力されるようで、データは残ります。 coutバッファ内。今のところ、この関数は私が最近持っていた最良のアイデアではないと思いますが、それでもcout、cerrなどに関連するバッファーをクリアする方法があるかどうか知りたいです。この種の関数を正しく機能させることは可能ですか?

4

4 に答える 4

6

上記のマクロを使用するか、次のようにします。

struct nullstream : ostream {
    nullstream() : ostream(0) { }
};

ostream& dout(int debug_level, ostream& out = cerr) {
    static nullstream dummy;
    return debug_level <= verbosity ? dummy : out;
}

// …

dout(level) << "foo" << endl;
dout(level, cout) << "IMPORTANT" << endl;

(使用endlするとフラッシュもトリガーされます。手動でフラッシュする必要はありません!)

于 2010-02-03T12:12:49.280 に答える
2

関数/テンプレートで実行できるかどうかはわかりません。マクロを使用したコードを知っています(ログメッセージとストリームが分離されています):

#define LOG(svrty, out, msg)\
do {\
  if (svrty >= debug_level) out << msg;\
} while(0)

これは機能しますが、より良い解決策に興味があります。構成とデバッグ レベルでログ出力先を決定する必要があることに注意してください。

于 2010-02-03T12:05:09.200 に答える
2

関数の本体が入力される前に関数パラメーターが評価されるため、常にメッセージが出力されます。マクロパラメーターは使用時にのみ評価されるため、マクロで必要と思われる効果を得ることができます。

#define DOUT( level, expr )   \
   if ( level >= verbosity )  {     \
      expr << endl;          \
  }

使用中で:

 DOUT( 42, cout << "The value is " << something );

あなたがうるさいなら、これをdo/whileループでラップしたいと思うでしょう-個人的には、私は決してそうしません.

于 2010-02-03T12:06:05.737 に答える
0

デバッグ レベルのランタイムは構成可能ですか?
そうでない場合は、テンプレートとテンプレートの特殊化を使用できます。

template <int DebugLevel, int Verbosity>
ostream &debug(ostream &out);

template<>
ostream &debug<7, 5>(ostream &out) { /* do stuff */ }

何も出力したくない場合は、Konrad Rudolphが提案したようにダミーのostreamを返すだけです。

于 2010-02-03T13:13:28.923 に答える