什么是 "a>b" 作为需要函数指针或 lambda 表达式的参数?
What is "a>b" as a parameter which requires a function pointer or lambda expression?
下面是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
);
}
根据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 应该是函数指针或 lambda 表达式。什么是 logging::trivial::severity >= logging::trivial::info
以及如何将其转换为函数?
用户自定义>=
的结果可以是任何类型,不一定是bool
。在这种情况下,库作者定义了一个>=
即returns一个函数对象。
草图大概是这样的
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 };
}
下面是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
);
}
根据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 应该是函数指针或 lambda 表达式。什么是 logging::trivial::severity >= logging::trivial::info
以及如何将其转换为函数?
用户自定义>=
的结果可以是任何类型,不一定是bool
。在这种情况下,库作者定义了一个>=
即returns一个函数对象。
草图大概是这样的
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 };
}