Namespaces
Variants

std::ranges:: constant_range

From cppreference.net
Ranges library
Range adaptors
헤더 파일에 정의됨 <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 의 정제된 개념으로, ranges::begin 상수 반복자 를 반환하는 범위입니다.
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() {}