std::ranges::range_adaptor_closure

来自cppreference.com
< cpp‎ | ranges
 
 
范围库
范围适配器
 
在标头 <ranges> 定义
template<class D >

    requires std::is_object_v<D>&&std::same_as<D, std::remove_cv_t<D>>

class range_adaptor_closure {};
(C++23 起)

std::ranges::range_adaptor_closure 是用于定义范围适配器闭包对象(RangeAdaptorClosureObject) 的辅助类模板。

t 为类型 T 的对象,实现确保满足下列所有条件的 t 为范围适配器闭包对象:

  • t 为接受一个 range 实参的一元函数对象。
  • T 存在唯一公开基类 ranges::range_adaptor_closure<T>,并且对于其他任意类型 UT 无基类类型 ranges::range_adaptor_closure<U>
  • T 不满足 range

[编辑]注解

功能特性测试标准功能特性
__cpp_lib_ranges202202L(C++23)std::ranges::range_adaptor_closure

[编辑]示例

#include <ranges>#include <string_view>   // 定义 Slice 为范围适配器闭包struct Slice : std::ranges::range_adaptor_closure<Slice>{std::size_t start =0;std::size_t end =std::string_view::npos;   constexprstd::string_view operator()(std::string_view sv)const{return sv.substr(start, end - start);}};   int main(){constexprstd::string_view str ="01234567";   constexpr Slice slicer{.start=1, .end=6};   // 使用 slicer 作为普通函数对象constexprauto sv1 = slicer(str); static_assert(sv1 =="12345");   // 使用 slicer 作为范围适配器闭包对象constexprauto sv2 = str | slicer; static_assert(sv2 =="12345");   // 范围适配器闭包可以如下组成constexprauto slice_and_drop = slicer | std::views::drop(2); static_assert(std::string_view(str | slice_and_drop)=="345");}
close