2

これはサンプル C++ コードです

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

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

このコードが実行されると、「メッセージ」が出力されます。

Q:これらのメッセージを破棄する最も簡単な方法は何ですか (印刷しない、保存しない)? 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) { return c; }

次に、標準の istream を使用し、そのストリーム バッファーを rdbuf を使用して streambuf クラスのインスタンスに設定できます。または、streambuf クラスのインスタンスを自動的に使用する独自の派生 ostream クラスを定義することもできます。

于 2013-02-18T07:26:18.130 に答える
0

汚いクイック:

std::ostream から派生し、<<何もしない T の演算子を実装するクラスを定義します。

残念ながら、これは場合によっては機能しない可能性があります: の<<演算子std::ostreamは多態的 (仮想ではない) ではないため、オーバーライドされたものは、ストリーム タイプがであり、 でない<<場合にのみ呼び出されます。yourstream&std::ostream&

より丁寧:

std::streambufバッファーを持たず、常に return 0でoverlflowをオーバーライドするクラスを使用して、派生します。

次にstd::ostream、そのバッファに関連付けられた を作成し、getLog(); から返します。

これによりostream、値をテキストに変換し、文字をバッファに送信するという仕事をすることができます。バッファは何もせずにそれらを食べます。

ライブラリには礼儀正しく、あまり効率的ではなくostream、いずれにせよ呼び出される値からテキストへのルーチンです。

最も効率的な:

ロギングステートメントのコンパイルを条件付きにする: like

#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 に答える