Namespaces
Variants

std::ranges::range_adaptor_closure

cppreference.net에서 가져옴
 
 
범위 라이브러리
범위 어댑터
 
헤더 <ranges>
template< class D >
    requires std::is_object_v<D> && std::same_as<D, std::remove_cv_t<D>>
class range_adaptor_closure {};
에 정의됨

std::ranges::range_adaptor_closure(C++23부터)는 RangeAdaptorClosureObject

를 정의하기 위한 도우미 클래스 템플릿입니다. t를 T 타입의 객체라고 할 때, 구현은 모든 요구 사항이 충족되면 t이 범위 어댑터 클로저 객체임을 보장합니다:

  • t는 하나의 range 인자를 받는 단항 함수 객체입니다.
  • T는 정확히 하나의 공용 기본 클래스 ranges::range_adaptor_closure<T>를 가지며, T는 다른 타입 ranges::range_adaptor_closure<U>에 대한 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");
}