#c #boost #c 17
Вопрос:
Ниже приведено очень простое использование boost::log::set_filter,
#include lt;boost/log/trivial.hppgt; #include lt;boost/log/core.hppgt; #include lt;boost/log/trivial.hppgt; #include lt;boost/log/expressions.hppgt; #include lt;boost/log/utility/setup/file.hppgt; namespace logging = boost::log; void test() { logging::add_file_log("sample.log")-gt;set_filter( logging::trivial::severity gt;= logging::trivial::info ); }
В соответствии с определением set_filter,
templatelt; typename FunT gt; void set_filter(FunT constamp; filter) { BOOST_LOG_EXPR_IF_MT(boost::log::aux::exclusive_lock_guardlt; mutex_type gt; lock(m_Mutex);) m_Filter = filter; }
фильтр должен быть указателем функции или лямбда-выражением. Что такое logging::trivial::severity gt;= logging::trivial::info
и как оно преобразуется в функцию?
Комментарии:
1. Он известен как шаблонные выражения и почти неизменно используется для создания объектов отложенных функций , которые могут быть выполнены позже в определенном контексте (например, в данном случае фактический уровень серьезности). Заполнители очень похожи на
_1
,_2
… сstd::bind
Ответ №1:
Результат, определенный пользователем gt;=
, может быть любого типа, это не обязательно должно быть bool
. В этом случае автор библиотеки определил gt;=
, что возвращает объект функции.
В качестве наброска это что-то вроде этого
struct severity_t {} severity; enum severity_level { info, ... }; struct greater_equal_filter { severity_level level; bool operator()(severity_level other) { return other gt;= level; } }; greater_equal_filter operatorgt;=(severity_t, severity_level level) { return { level }; }