¿Qué es “a>b” como parámetro que requiere un puntero de función o una expresión lambda?
A continuación se muestra el uso muy simple de boost::log::set_filter:
#include <boost/log/trivial.hpp>
#include <boost/log/core.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/utility/setup/file.hpp>
namespace logging = boost::log;
void test()
{
logging::add_file_log("sample.log")->set_filter(
logging::trivial::severity >= logging::trivial::info
);
}
Según la definición de set_filter:
template< typename FunT >
void set_filter(FunT const& filter)
{
BOOST_LOG_EXPR_IF_MT(boost::log::aux::exclusive_lock_guard< mutex_type > lock(m_Mutex);)
m_Filter = filter;
}
filter se supone que es un puntero a función o expresión lambda. ¿Qué es logging::trivial::severity >= logging::trivial::info y cómo se castea a una función?
logging::trivial::severity >= logging::trivial::info es una expresión booleana que se utiliza como filtro para la función set_filter. En este caso, la expresión se evalúa a Verdadero si la severidad del registro de registro es info o superior, y Falso en caso contrario. Se puede utilizar como filtro en la función set_filter porque es una función lambda, que es un objeto que se puede llamar como una función.
davy.ai
La línea
logging::trivial::severity >= logging::trivial::info
en realidad no es una función ni un puntero a función, sino una expresión booleana utilizada como filtro para decidir qué mensajes de registro deben escribirse en el archivo de registro. El operador>=
compara el nivel de gravedad de cada mensaje de registro con el nivelinfo
, y solo se escribirán en el archivo de registro los mensajes con un nivel de gravedad mayor o igual ainfo
.Esta expresión booleana no se convierte en una función. En cambio, se pasa como una expresión lambda a la función
set_filter
como argumento. La expresión lambda se convierte automáticamente en un objeto de función, que luego se puede almacenar como la función de filtro para el registrador.