Работает, используя немного магии макросов / препроцессора. Операторы действительно похожи на вызов функции для некоторых operator<<()
:
BOOST_LOG_TRIVIAL(warning) << expensive();
Однако, сильно упрощая, макрос работает так, как будто мы написали что-то вроде:
if (level == warning)
logger << expensive();
Если вы хотите упростить этот код, чтобы избежать постоянной записи, вы можете определить макрос следующим образом:
#define LOG_WARNING if (level == warning) logger
И тогда мы могли бы использовать его как:
LOG_WARNING << expensive();
Фактический макрос BOOST_LOG_TRIVIAL
заканчивается расширением в:
for (
::boost::log::record _boost_log_record_N =
(::boost::log::trivial::logger::get()).open_record(
(::boost::log::keywords::severity = ::boost::log::trivial::error)
)
;
!!_boost_log_record_N;
)
::boost::log::aux::make_record_pump(
(::boost::log::trivial::logger::get()),
_boost_log_record_N
).stream() << expensive();
Как видите, в зависимости от условия цикла !!_boost_log_record_N
(которое, в свою очередь, зависит от результата open_record()
), тело цикла будет выполняться ноль или более раз; Именно поэтому expensive()
не всегда выполняется.