Что такое «a>b» в качестве параметра, для которого требуется указатель на функцию или лямбда-выражение?

#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 }; }