/dev/null みたいな std::ostream

/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;