0

そのため、通常は実行時にログ ファイルに書き込みを行う C++ プログラムがあります。これは fstream を使用して行われます。ただし、ログをオフにする機能を含めたいと思います。基本的に、私のコードは次のようになります。

bool isLogging;
fstream* logFilePtr;

私のコード全体に、次のようなステートメントがたくさんあります。

(*logFilePtr) << "    Kernel call time in seconds: " << kTime << endl;
...

ここで、「isLogging」が true の場合、これらを印刷したくありません。一連の if ステートメントでそれらを囲むこともできますが、それよりもクリーンなものを好むでしょう。C++ ストリームを取得し、それをリダイレクトして「何もない」ようにする方法があると考えたので、 << 演算子が使用されたときに何も出力されません。

ストリームをリダイレクトする方法を知っている人、またはこれをエレガントな方法で処理する方法について他のアイデアを持っている人はいますか?

ありがとう、コリン

4

7 に答える 7

6

あなたはそれをクラスにまとめることができます。

class Log {
  Log (fstream &s) : stream(s), enabled(false) { }
  void Enable () { enabled = true; }
  void Disable () { enabled = false; }

  template<class T>
  Log &operator<< (T const& rhs) {
    if (enabled) stream << rhs;
    return *this;
  }

private:
  fstream &stream;
  bool enabled;
};

これはテストされていません..しかし、基本的な考え方はそこにあるはずです。

于 2009-07-09T14:51:51.360 に答える
4

rdbufメンバー関数を見てください。破棄するストリームバッファを作成し、それをストリームに関連付けることができます。

struct nullbuf: std::streambuf
{
    int overflow(int c) { return traits_type::not_eof(c); }
};
于 2009-07-09T14:56:13.690 に答える
0

プラットホーム?UNIXを使用している場合は、ファイルを/ dev/nullに書き込むことができます。

于 2009-07-09T14:53:04.540 に答える
0

POCOライブラリのログ機能を使用しています。チャネルの構成(コンソール、ファイル、両方)をサポートします。出力およびログレベルの形式の構成(トレース、デバッグ、エラーなど)。次に、ロギング機能を次のような関数で囲みます。

inline void logError(const std::string & str)
{
#ifdef COMPILE_ERROR_LOGGING
   g_pMyPocoLogger->error(str);
#endif
}

ライブラリを使用しないことを選択することもできますが、それでもロギングをラッパーで囲むことをお勧めします。

于 2009-07-09T14:54:17.330 に答える
0
std::ostream& Debug(int level) {
  std::clog.clear(levell <= shown_level ? std::ios_base::goodbit: std::ios_base::badbit);
  return std::clog;
}

comp.lang.c++から。

于 2009-07-09T15:07:17.630 に答える
0

「これを処理する方法に関するその他のアイデア」の下:

  1. 状態パターンを使用して、すべてのコードの if チェックを不要にします。
  2. Logging ポリシー オブジェクトでポリシー パターン (コンパイル時戦略パターン) を使用します。
于 2009-07-09T15:17:44.223 に答える