#include <ranges>#include <string_view> // Define Slice as a range adaptor closurestruct 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}; // use slicer as a normal function objectconstexprauto sv1= slicer(str); static_assert(sv1=="12345"); // use slicer as a range adaptor closure objectconstexprauto sv2= str| slicer; static_assert(sv2=="12345"); // range adaptor closures can be composedconstexprauto slice_and_drop= slicer| std::views::drop(2); static_assert(std::string_view(str| slice_and_drop)=="345");}