例如,如果我传入std::less
,我希望它创建一个行为等于std::greater
的新比较器。用于模板。
可以启用std::map<int, int, std::invert<std::less>>
之类的语法的东西(除非我要找的东西存在,那不是它的名字)。是否存在?
答案 0 :(得分:4)
有std::not_fn
,which:
创建一个转发呼叫包装器,该包装器返回其持有的可调用对象的求反。
但是,在这种情况下,它将导致比较器具有std::greater_equal
而不是std::greater
的功能。此外,类型与std::greater_equal
不同。
示例:
auto greater_eq = std::not_fn(std::less<>());
要获得与std::greater
相等的效果,可以通过翻转参数来实现。我认为标准库中没有该函数,但是编写自己很简单:
auto flip = [](auto fun) {
return [fun = std::move(fun)]
(const auto& arg1, const auto& arg2)
{
return fun(arg2, arg1);
};
};
auto greater = flip(std::less<>());
这也可以扩展为支持任意数量的参数,仅翻转前两个参数(使其类似于Haskell的flip
),并支持参数的完美传递,但是这些功能可能会使参数复杂化。简洁的示例,比较器不需要。