Namespaces
Variants

std::ranges:: views:: elements, std::ranges:: elements_view

From cppreference.net
Ranges library
Range adaptors
헤더 파일에 정의됨 <ranges>
template < ranges:: input_range V, std:: size_t N >

requires ranges:: view < V > &&
/*has-tuple-element*/ < ranges:: range_value_t < V > , N > &&
/*has-tuple-element*/ < std:: remove_reference_t <
ranges:: range_reference_t < V >> , N > &&
/*returnable-element*/ < ranges:: range_reference_t < V > , N >
class elements_view

: public ranges:: view_interface < elements_view < V, N >> ;
(1) (C++20부터)
namespace views {

template < std:: size_t N >
constexpr /* 지정되지 않음 */ elements = /* 지정되지 않음 */ ;

}
(2) (C++20부터)
호출 시그니처
template < ranges:: viewable_range R >

requires /* 아래 참조 */

constexpr ranges:: view auto elements < N > ( R && r ) ;
(C++20부터)
헬퍼 개념
(3)
template < class T, std:: size_t N >

concept /*has-tuple-element*/ =
requires ( T t ) {
typename std:: tuple_size < T > :: type ;
requires N < std:: tuple_size_v < T > ;
typename std:: tuple_element_t < N, T > ;
{ std :: get < N > ( t ) } - > std:: convertible_to <
const std:: tuple_element_t < N, T > & > ;

} ;
(C++23 이전)
( 설명 전용* )
template < class T, std:: size_t N >

concept /*has-tuple-element*/ =

/*tuple-like*/ < T > && N < std:: tuple_size_v < T >
(C++23 이후)
( 설명 전용* )
template < class T, std:: size_t N >

concept returnable - element =
std:: is_reference_v < T > || std:: move_constructible <

std:: tuple_element_t < N, T >> ;
(4) ( 설명 전용* )
1) 튜플과 유사한 값들의 view 를 수신하고, 적응된 뷰의 값 타입에서 N 번째 요소를 값 타입으로 갖는 뷰를 생성합니다.
2) views::elements 의 모든 특수화는 RangeAdaptorObject 입니다. 표현식 views :: elements < M > ( e ) 표현식 동등 합니다 elements_view < views:: all_t < decltype ( ( e ) ) > , M > { e } 에 대해, 적절한 부분표현식 e 와 상수 표현식 M 이 주어질 때.
3) 기본 뷰의 요소들이 tuple-like 값임을 보장합니다 , tuple-like 참조 (C++23부터) .
4) 댕글링 참조가 반환될 수 없도록 보장합니다.

elements_view 는 기본 뷰 V 가 해당 개념들을 모델링할 때 random_access_range , bidirectional_range , forward_range , input_range , common_range , 그리고 sized_range 개념들을 모델링합니다.

목차

데이터 멤버

멤버 설명
V base_ 기반 뷰
( 설명 전용 멤버 객체* )

멤버 함수

elements_view 를 생성합니다
(public 멤버 함수)
기본(적응된) 뷰의 복사본을 반환합니다
(public 멤버 함수)
시작 부분에 대한 반복자를 반환합니다
(public 멤버 함수)
끝 부분에 대한 반복자나 센티널을 반환합니다
(public 멤버 함수)
기본(적응된) 범위가 sized_range 를 만족하는 경우에만 요소의 개수를 반환합니다
(public 멤버 함수)
결과 approximately_sized_range 의 대략적인 크기를 반환합니다
(public 멤버 함수)
std::ranges::view_interface 에서 상속됨
파생된 뷰가 sized_range 또는 forward_range 를 만족하는 경우에만 해당 뷰가 비어 있는지 여부를 반환합니다
( std::ranges::view_interface<D> 의 public 멤버 함수)
(C++23)
범위의 시작 부분에 대한 상수 반복자를 반환합니다
( std::ranges::view_interface<D> 의 public 멤버 함수)
(C++23)
범위의 상수 반복자에 대한 센티널을 반환합니다
( std::ranges::view_interface<D> 의 public 멤버 함수)
ranges::empty 가 적용 가능한 경우에만 파생된 뷰가 비어 있지 않은지 여부를 반환합니다
( std::ranges::view_interface<D> 의 public 멤버 함수)
파생된 뷰가 forward_range 를 만족하는 경우 첫 번째 요소를 반환합니다
( std::ranges::view_interface<D> 의 public 멤버 함수)
파생된 뷰가 bidirectional_range common_range 를 만족하는 경우에만 마지막 요소를 반환합니다
( std::ranges::view_interface<D> 의 public 멤버 함수)
파생된 뷰가 random_access_range 를 만족하는 경우에만 n 번째 요소를 반환합니다
( std::ranges::view_interface<D> 의 public 멤버 함수)

중첩 클래스

반복자 타입
( 설명 전용 멤버 클래스 템플릿* )
센티넬 타입
( 설명 전용 멤버 클래스 템플릿* )

헬퍼 템플릿

template < class T, std:: size_t N >

constexpr bool enable_borrowed_range < std :: ranges :: elements_view < T, N >> =

ranges:: enable_borrowed_range < T > ;
(C++20 이후)

ranges::enable_borrowed_range 의 이 특수화는 기본 뷰가 이를 만족할 때 elements_view borrowed_range 를 만족하도록 합니다.

예제

#include <iostream>
#include <ranges>
#include <string>
#include <tuple>
#include <vector>
int main()
{
    const std::vector<std::tuple<int, char, std::string>> vt
    {
        {1, 'A', "α"},
        {2, 'B', "β"},
        {3, 'C', "γ"},
        {4, 'D', "δ"},
        {5, 'E', "ε"},
    };
    for (int const e : std::views::elements<0>(vt))
        std::cout << e << ' ';
    std::cout << '\n';
    for (char const e : vt | std::views::elements<1>)
        std::cout << e << ' ';
    std::cout << '\n';
    for (std::string const& e : std::views::elements<2>(vt))
        std::cout << e << ' ';
    std::cout << '\n';
}

출력:

1 2 3 4 5
A B C D E
α β γ δ ε

결함 보고서

다음 동작 변경 결함 보고서는 이전에 게시된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 3494 C++20 elements_view 는 절대 borrowed_range 가 아니었음 기본 뷰가 borrowed_range 인 경우
해당 뷰도 borrowed_range 가 됨
LWG 3502 C++20 elements_view 에서 댕글링 참조를 얻을 수 있었음 해당 사용법이 금지됨

참고 항목

pair-like 값들로 구성된 view 를 취하여 각 pair의 첫 번째 요소들로 구성된 view 를 생성함
(클래스 템플릿) (range adaptor 객체)
pair-like 값들로 구성된 view 를 취하여 각 pair의 두 번째 요소들로 구성된 view 를 생성함
(클래스 템플릿) (range adaptor 객체)
적응된 view들의 해당 요소들에 대한 참조들의 튜플로 구성된 view
(클래스 템플릿) (customization point 객체)
적응된 view들의 해당 요소들에 변환 함수를 적용한 결과들로 구성된 view
(클래스 템플릿) (customization point 객체)
valarray의 BLAS-like slice: 시작 인덱스, 길이, stride
(클래스)