プリプロセッサマクロでのostreamに追加

パトリック・ベルトーニ:

私は広範囲に模倣したいBOOST_LOG_TRIVIALカスタムでは、使用するかを定義するstd::cout代わりに。

// Building with
// g++ -std=c++14 -Wall -pedantic -g -O0 -DBOOST_LOG_DYN_LINK -c log.cpp
// g++ log.o -lpthread -lboost_log -lboost_log_setup  -lboost_system -lboost_thread -o bl

#define FORBID_BOOST_LOG
#define VALUE_TO_STRING(x) #x

#ifdef FORBID_BOOST_LOG
    #include <iostream>
    #define LOG(sev) std::cout << "[" << VALUE_TO_STRING(sev) << "]  "
#else
    #include <boost/log/trivial.hpp>
    #define LOG(sev) BOOST_LOG_TRIVIAL(sev)
#endif

int main()
{
    LOG(info) << "hello logging";
}

これはいいですが、素敵な末尾の改行文字は、ブースト些細な伐採によって追加したことを、ここに唯一欠けている機能。

私はいくつかのブーストヘッダを越え読み、実際のmantain百正しいプリプロセッサ構文について見当がつかないましLOG(sev)プリプロセッサ選択実装についてとらわれない呼び出し。

アランBirtles:

一つの解決策は、破壊に改行を出力するログオブジェクトを作成することです。あなたは、ログメッセージの最後に新しい行を取得しますので、オブジェクトが(これはブーストログがあまりにもどのように動作するかおそらく)ログ式の終わりに破壊されます。

#include <iostream>
struct Log
{
    Log(const char* sev)
    {
        std::cout << "[" << VALUE_TO_STRING(sev) << "]  ";
    }
    ~Log()
    {
        std::cout << "\n";
    }

    template < typename T >
    Log& operator <<(const T& value)
    {
        std::cout << value;
        return *this;
    }
};
#define LOG(sev) Log(VALUE_TO_STRING(sev))

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=278490&siteId=1