Namespaces
Variants

std::ranges::subrange<I,S,K>:: operator PairLike

From cppreference.net
Ranges library
Range adaptors
template < /*different-from*/ < subrange > PairLike >

requires /*pair-like-convertible-from*/ < PairLike, const I & , const S & >

constexpr operator PairLike ( ) const ;
(1) (C++20부터)
도우미 개념
template < class T >
concept /*pair-like*/ = /* 설명 참조 */ ;
(2) ( 설명 전용* )
template < class T, class U, class V >
concept /*pair-like-convertible-from*/ = /* 설명 참조 */ ;
(3) ( 설명 전용* )
1) subrange 를 pair-like 타입으로 변환합니다.
/*different-from*/ 의 정의는 different-from 를 참조하십시오.
2) 타입이 pair-like 인지 여부를 결정합니다.

다음과 동등합니다:

template< class T >
concept /*pair-like*/ =
    !std::is_reference_v<T> && requires(T t)
    {
        typename std::tuple_size<T>::type;
        requires std::derived_from<std::tuple_size<T>,
                                   std::integral_constant<std::size_t, 2>>;
        typename std::tuple_element_t<0, std::remove_const_t<T>>;
        typename std::tuple_element_t<1, std::remove_const_t<T>>;
        { std::get<0>(t) } -> std::convertible_to<
                                  const std::tuple_element_t<0, T>&>;
        { std::get<1>(t) } -> std::convertible_to<
                                  const std::tuple_element_t<1, T>&>;
    };
(C++23 이전)

이 개념은 라이브러리 전체에서 노출 전용 개념인 pair-like 와 동등합니다.

(C++23 이후)
3) pair-like 타입이 서로 다른 주어진 두 타입의 값들로부터 생성 가능한지 여부를 결정합니다.

다음과 동등합니다:

template< class T, class U, class V >
concept /*pair-like-convertible-from*/ =
    !ranges::range<T> && /*pair-like*/<T> &&
    std::constructible_from<T, U, V> &&
    /*convertible-to-non-slicing*/<U, std::tuple_element_t<0, T>> &&
    std::convertible_to<V, std::tuple_element_t<1, T>>;
(C++23 이전)

다음과 동등합니다:

template< class T, class U, class V >
concept /*pair-like-convertible-from*/ =
    !ranges::range<T> && !std::is_reference_v<T> && /*pair-like*/<T> &&
    std::constructible_from<T, U, V> &&
    /*convertible-to-non-slicing*/<U, std::tuple_element_t<0, T>> &&
    std::convertible_to<V, std::tuple_element_t<1, T>>;
(C++23 이후)

목차

반환값

PairLike ( begin_  , end_  )

참고 사항

표준 라이브러리에서 다음 타입들은 pair와 유사합니다:

(C++26부터)


이러한 타입들 중 하나로부터 파생된 프로그램 정의 타입은 다음과 같은 조건을 만족하면 pair-like 타입이 될 수 있습니다:

  • std::tuple_size std::tuple_element 가 이 타입에 대해 올바르게 특수화되어 있고,
  • 해당 값에 대한 std :: get < 0 > std :: get < 1 > 호출이 올바른 형식을 갖는 경우.
(until C++23)

subrange 특수화는 range 타입이므로, 이 변환 함수를 통해 변환이 수행되지 않습니다.

std::array 특수화는 range 타입이기 때문에 subrange 로부터 변환될 수 없습니다.

예제

#include <iostream>
#include <ranges>
#include <string>
#include <utility>
using striter = std::string::const_iterator;
using legacy_strview = std::pair<striter, striter>;
void legacy_print(legacy_strview p)
{
    for (; p.first != p.second; ++p.first)
        std::cout << *p.first << ' ';
    std::cout << '\n';
}
int main()
{
    std::string dat{"ABCDE"};
    for (auto v{std::ranges::subrange{dat}}; v; v = {v.begin(), v.end() - 1})
    {
        /*...*/
        legacy_print(legacy_strview{v});
    }
}

출력:

A B C D E 
A B C D 
A B C 
A B 
A

참고 항목

타입이 tuple 프로토콜 을 구현했음을 지정함
( std::get , std::tuple_element , std::tuple_size )
( 설명 전용 개념* )