Voi*_*tar 4 c++ templates comparator c++-standard-library
例如,如果我传入std::less
,我希望它创建一个行为等于 的新比较器std::greater
。用于模板。
可以启用类似语法std::map<int, int, std::invert<std::less>>
的东西(除非我正在寻找的东西存在,那不是它的名字)。这存在吗?
有std::not_fn
,其中:
创建一个转发调用包装器,返回它持有的可调用对象的否定。
但是,在这种情况下,它会导致比较器的功能为std::greater_equal
,而不是std::greater
。此外,类型与std::greater_equal
.
例子:
auto greater_eq = std::not_fn(std::less<>());
Run Code Online (Sandbox Code Playgroud)
要获得 等价物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<>());
Run Code Online (Sandbox Code Playgroud)
这也可以扩展以支持任意数量的参数,仅翻转前两个(使其flip
类似于来自 Haskell),以及支持参数的完美转发,但这些功能可能会使简洁的示例变得相当复杂,并且不是比较器需要。