C++20 范围是否具有过滤器或 any_of 的值非谓词版本?

问题描述

经典 C++ 有时为谓词算法选择 _if 后缀(而不是取值的算法),例如find_if/find count_if/count 有时它会 not(例如 any_of 虽然它需要谓词但没有 _if 后缀,并且没有算法的 any_of 值版本)。

据我所知,C++20 filterranges::any_of 没有值重载。

我浏览了 C++20 的整个 cppreference 页面并没有发现任何东西,我认为这只是因为 C++20 范围库非常有限(只有很少的视图)并且它与现有功能匹配(在 { 的情况下) {1}})。

我最好的尝试是包装逻辑并给它一个名称

any_of

解决方法

C++20 范围是否具有过滤器或 any_of 的值(非谓词)版本?

没有

但是写起来很容易:

std::ranges::any_of(r,[&](auto const& e){ return e == value; })

或者,如果认为时间太长,您可以添加一个助手:

inline constexpr auto equals = [](auto const& value){
    return [=](auto const& e){ return e == value; };
};

您可以使用它来缩短 any_of 调用:

std::ranges::any_of(r,equals(value));

或者您可以使用任意数量的库来编写占位符-lambda,最近使用的是Boost.Lambda2

std::ranges::any_of(r,_1 == value);