/dev/null みたいな std::ostream を作る方法.
方法1 : std::ostreamを継承して自前の null stream を作成する
以下のURLで紹介されている方法
stackoverflow.com
#include <iostream> class NulStreambuf : public std::streambuf { char dummyBuffer[ 64 ]; protected: virtual int overflow( int c ) { setp( dummyBuffer, dummyBuffer + sizeof( dummyBuffer ) ); return c == traits_type::eof()?'\0':c; } }; class NulOStream : private NulStreambuf, public std::ostream { public: NulOStream() : std::ostream( this ) {} NulStreambuf* rdbuf() const { return (NulStreambuf*)this; } }; int main() { bool output_enabled=false; NulOStream nos; std::ostream &os = (output_enabled)?std::cout : nos; os << "Hello" << std::endl; os << "c++" << std::endl; return 0; }
方法2:boostの boost::iostreams::null_sink を使う
boostに実装がある.詳細は boost/iostreams/device/null.hpp あたりを読めばわかるので,割愛
方法3: マクロで回避
実際のコードは,多くの場合以下のような形になる
bool output_enabled = false; if (output_enabled) std::cout << "Hello" << std::end; if (output_enabled) std::cout << "c++" << std::end;
と言うわけで
#define LOG if (output_enabled) std::cout bool output_enabled = false; LOG << "Hello" << std::end; LOG << "c++" << std::end;
実はこれだけで解決する
こう言う形でもいいかも
#define LOG if (x) std::cout bool output_enabled = false; LOG(output_enabled) << "Hello" << std::end; LOG(output_enabled) << "c++" << std::end;