std::coutを一時的に無効にする

状況に応じてstd::coutで出力していたものを一時的に無効にして, コンソールに何も出力されないようにしたい. ちょっと検索してみると以下のようなスレッドがひっかかった. 読んでみると面白い.

http://stackoverflow.com/questions/8246317/redirecting-function-output-to-dev-null
http://bytes.com/topic/c/answers/133250-there-null-ostream-like-dev-null-cpp
https://bbs.archlinux.org/viewtopic.php?id=79378

std::coutそのものが何も吐かないようにする方法については上のスレッドを読んでもらうとして.

僕の場合はコードのある一部分だけのことであり, コンパイル時のマクロで切り替えるようなものだったので簡単に以下のようにした.

#include <iostream>
#ifdef SILENT
#include <sstream>
#endif

int main()
{
  {
#ifndef SILENT
    using namespace std;
#else
    std::stringstream cout;
#endif

    cout << "Boring message. " << std::endl;
  }

  std::cout << "Interesting message." << std::endl;
  return 0;
}

この例ではほとんど意味がない(直接出力行を囲めば良い)が, 出力部分と実行部分が入り乱れており, いちいち囲むと面倒なのでこれはこれで助かった. fstreamをインクルードして, std::ofstream cout("/dev/null", std::ios::out | std::ios::app);としても良い. ただ, /dev/nullが環境依存なのと, 抜ける前にcloseする必要があるため, 今回は簡単に上のようにした.

もちろん, これだと呼び出し先の関数がstd::coutに吐いていたら出力されてしまうので, それも止めたければ, coutのrdbufを上書きして下さい.