Namespaces
Variants

std::ranges:: range_adaptor_closure

From cppreference.net
Ranges library
Range adaptors
헤더 파일에 정의됨 <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 는 정확히 하나의 public 기본 클래스 ranges :: range_adaptor_closure < T > 를 가지며, T 는 다른 타입 U 에 대한 ranges :: range_adaptor_closure < U > 타입의 기본 클래스를 가지지 않습니다.
  • T range 를 만족하지 않습니다.

참고 사항

기능 테스트 매크로 표준 기능
__cpp_lib_ranges 202202L (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;
    constexpr std::string_view operator()(std::string_view sv) const
    {
        return sv.substr(start, end - start);
    }
};
int main()
{
    constexpr std::string_view str = "01234567";
    constexpr Slice slicer{.start = 1, .end = 6};
    // slicer를 일반 함수 객체로 사용
    constexpr auto sv1 = slicer(str);
    static_assert(sv1 == "12345");
    // slicer를 범위 어댑터 클로저 객체로 사용
    constexpr auto sv2 = str | slicer;
    static_assert(sv2 == "12345");
    // 범위 어댑터 클로저는 조합 가능
    constexpr auto slice_and_drop = slicer | std::views::drop(2);
    static_assert(std::string_view(str | slice_and_drop) == "345");
}