Как реализовать макрос записи с автоматическим переводом строки в 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()