Как реализовать макрос записи с автоматическим переводом строки в C++

В глоге библиотеки C++ (модуль логирования Google) есть хороший интерфейс, где вы можете написать

LOG(INFO) << "abc " << my_var;

и во время выполнения он печатает что-то вроде abc 5\n во время выполнения (если my_var было 5), где он автоматически завершается переводом строки.

Это намного лучше, чем всегда заканчиваться std::endl как в

std::cout << "abc " << my_var << std::endl;

Какой самый простой способ (код + макросы) мне нужно повторить этот эффект в моем коде?

1 ответ

Решение

Я думаю, что идея состоит в том, чтобы вернуть объект-оболочку temp:

#include <iostream>

struct Log
{
    ~Log(void) { ::std::cout << ::std::endl; }
};

template<typename T> Log &&
operator <<(Log && wrap, T const & whatever)
{
    ::std::cout << whatever;
    return ::std::move(wrap);
}

int main()
{
    Log() << "whatever";
    Log() << "more";
    return 0;
}

онлайн компилятор

Обратите внимание, что макрос может использоваться здесь для выполнения условного ветвления в начале регистрации. Это пропускает логирование, если уровень серьезности низкий.

#define LOG(level) \
    if(g_log_lelevel <= level) Log()
Другие вопросы по тегам