Search code examples
c++boostc++17

What is "a>b" as a parameter which requires a function pointer or lambda expression?


Below is the very simple use of 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
);
}

According to definition of 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 is supposed to be a function pointer or lambda expression. What is logging::trivial::severity >= logging::trivial::info and how it is casted to a function?


Solution

  • The result of a user-defined >= can be any type, it does not have to be bool. In this case, the library author defined a >= that returns a function object.

    As a sketch, it's something like this

    struct severity_t {} severity;
    
    enum severity_level {
        info,
        ...
    };
    
    struct greater_equal_filter
    {
        severity_level level;
        bool operator()(severity_level other) { return other >= level; }
    };
    
    greater_equal_filter operator>=(severity_t, severity_level level) {
        return { level };
    }