有什么可以通用地转换C ++比较器类型的吗?

时间:2019-05-31 02:10:05

标签: c++ templates comparator c++-standard-library

例如,如果我传入std::less,我希望它创建一个行为等于std::greater的新比较器。用于模板。

可以启用std::map<int, int, std::invert<std::less>>之类的语法的东西(除非我要找的东西存在,那不是它的名字)。是否存在?

1 个答案:

答案 0 :(得分:4)

std::not_fnwhich

  

创建一个转发呼叫包装器,该包装器返回其持有的可调用对象的求反。

但是,在这种情况下,它将导致比较器具有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),并支持参数的完美传递,但是这些功能可能会使参数复杂化。简洁的示例,比较器不需要。