Namespaces
Variants

std::ranges::constant_range

cppreference.net에서
 
 
범위 라이브러리
범위 어댑터
 
헤더 <ranges>
template< class T >
concept constant_range =
    ranges::input_range<T> &&
    /*constant-iterator*/<ranges::iterator_t<T>>;
에 정의됨 (1) (C++23부터)
헬퍼 개념
template< class T >
concept /*constant-iterator*/ =
    std::input_iterator<T> &&
    std::same_as<std::iter_const_reference_t<T>, std::iter_reference_t<T>>;
(2) (설명 전용*)
1) constant_range 개념은 range의 정제(refinement)이며, ranges::begin이(가) constant iterator를 반환합니다.
2) 개념 /*constant-iterator*/<T>은(는) 입력 반복자의 간접 참조 연산 결과가 const 참조 타입일 때 충족되며, 이는 읽기 전용을 의미합니다.

예제

#include <ranges>
#include <span>
#include <string_view>
#include <vector>
// 매개변수가 상수 범위임을 보장하는 메커니즘
// 1) 가변 오버로드가 상수 오버로드에 위임하는 오버로드 집합
template<std::ranges::constant_range R>
void takes_any_range1(R&& r)
{
    // R은 확실히 상수 범위임
}
template<std::ranges::range R>
void takes_any_range1(R&& r)
{
    takes_any_range1(std::views::as_const(std::forward<R>(r)));
}
// 2) 매개변수를 섀도잉하는 단일 함수 템플릿
template<std::ranges::range R>
void takes_any_range2(R&& _r)
{
    auto r = std::views::as_const(std::forward<R>(_r));
    // r은 확실히 상수 범위임
    // _r을 다시 사용하지 않음
}
// 3) 재귀적으로 자신을 호출하는 단일 함수 템플릿
template<std::ranges::range R>
void takes_any_range3(R&& r)
{
    if constexpr (std::ranges::constant_range<R>)
    {
        // R은 확실히 상수 범위임
        // 구현을 여기에 배치
    }
    else
        takes_any_range3(std::views::as_const(std::forward<R>(r)));
}
static_assert
(
        std::ranges::constant_range<const std::vector<int>> and
    not std::ranges::constant_range<std::vector<int>> and
        std::ranges::constant_range<std::string_view> and
    not std::ranges::constant_range<std::span<int>> and
        std::ranges::constant_range<std::span<const int>> and
    not std::ranges::constant_range<const std::span<int>>
);
int main() {}