问题描述
在下面的示例中,创建了一个 struct Comp
。有没有办法使它成为 std::function
或在调用 std::equal_range
时编写比较器本身?我可以去掉 struct
吗?
struct Comp
{
bool operator() ( const S& s,int i ) const { return s.number < i; }
bool operator() ( int i,const S& s ) const { return i < s.number; }
};
const auto p2 = std::equal_range(vec.begin(),vec.end(),2,Comp{});
解决方法
您可以使用 boost::hana::overload
来重载 lambda:
auto constexpr comp = boost::hana::overload(
[]( const S& s,int i ) { return s.number < i; },[]( int i,const S& s ) { return i < s.number; }
);
const auto p2 = std::equal_range(vec.begin(),vec.end(),2,comp);
显然,您可以将整个 boost::hana::overload(…)
内容放在对 std::equal_range
的调用中,但它只会降低代码的可读性,恕我直言。
但是,我要强调的是,无论您是否自己编写,最终都可能使用 struct
/class
;例如std::function
是模板化的 class
,boost::hana::overload
是给定 class
的对象,依此类推。
由于您尚未指定标准,因此可能使用 Jeff Garrett 解决方案是可行的方法(尽管我会将 vec.begin(),
更改为 vec,
,如果您要处理整个 {{1 }})。如果您必须符合 C++17,则可以使用 Range-v3:
vec
这也适用于 C++14,只要您不依赖于 CTAD:
#include <range/v3/algorithm/equal_range.hpp>
// ...
const auto p2 = ranges::equal_range(vec,std::less{},[](const S& s) { return s.number; });
,
范围版本支持投影:
std::ranges::equal_range(vec.begin(),[](const S& s) { return s.number; });