Добавить к ostream в макросе препроцессора - PullRequest
0 голосов
/ 12 марта 2020

Я бы подражал широко распространенному 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";
}

Что приятно, но единственная функция, отсутствующая здесь, это хороший трейлинг-символ новой строки, добавленный тривиальное ведение журнала буста.

Я прочитал несколько заголовков буста, но на самом деле не имею представления о правильном синтаксисе препроцессора для поддержки сотен LOG(sev) вызовов agnosti c о выбранной реализации препроцессора.

1 Ответ

1 голос
/ 12 марта 2020

Одним из решений является создание объекта регистрации, который печатает новую строку при уничтожении. Объект будет уничтожен в конце выражения логирования, поэтому в конце вашего сообщения журнала вы получите новую строку (вероятно, именно так работает журнал форсирования):

#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))
...