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 を参照 (C++23以降)
4) ダングリング参照が返されないことを保証します。

elements_view は、基盤となるビュー V がそれぞれのコンセプトをモデル化する場合、 random_access_range bidirectional_range forward_range input_range common_range 、および sized_range のコンセプトをモデル化します。

目次

データメンバ

メンバー 説明
V base_ 基となるビュー
( 説明専用メンバーオブジェクト* )

メンバー関数

elements_view を構築する
(公開メンバ関数)
基となる(アダプトされた)ビューのコピーを返す
(公開メンバ関数)
先頭を指すイテレータを返す
(公開メンバ関数)
終端を指すイテレータまたは番兵を返す
(公開メンバ関数)
要素数を返す(基となる(アダプトされた)範囲が sized_range を満たす場合にのみ提供)
(公開メンバ関数)
結果の approximately_sized_range の近似サイズを返す
(公開メンバ関数)
std::ranges::view_interface から継承
派生ビューが空かどうかを返す( sized_range または forward_range を満たす場合にのみ提供)
( std::ranges::view_interface<D> の公開メンバ関数)
(C++23)
範囲の先頭を指す定数イテレータを返す
( std::ranges::view_interface<D> の公開メンバ関数)
(C++23)
範囲の定数イテレータの番兵を返す
( std::ranges::view_interface<D> の公開メンバ関数)
派生ビューが空でないかどうかを返す( ranges::empty が適用可能な場合にのみ提供)
( std::ranges::view_interface<D> の公開メンバ関数)
派生ビューの最初の要素を返す( forward_range を満たす場合に提供)
( std::ranges::view_interface<D> の公開メンバ関数)
派生ビューの最後の要素を返す( bidirectional_range かつ common_range を満たす場合にのみ提供)
( std::ranges::view_interface<D> の公開メンバ関数)
派生ビューの n th 番目の要素を返す( random_access_range を満たす場合にのみ提供)
( std::ranges::view_interface<D> の公開メンバ関数)

ネストされたクラス

イテレータ型
( 説明専用メンバクラステンプレート* )
センチネル型
( 説明専用メンバクラステンプレート* )

ヘルパーテンプレート

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 の特殊化は、基になるビューが 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 からダングリング参照が取得される可能性があった そのような使用法は禁止される

関連項目

ペアのような値からなる view を受け取り、各ペアの最初の要素からなる view を生成する
(クラステンプレート) (range adaptor object)
ペアのような値からなる view を受け取り、各ペアの2番目の要素からなる view を生成する
(クラステンプレート) (range adaptor object)
アダプトされたビューの対応する要素への参照のタプルからなる view
(クラステンプレート) (customization point object)
アダプトされたビューの対応する要素に変換関数を適用した結果からなる view
(クラステンプレート) (customization point object)
valarrayのBLASライクなスライス:開始インデックス、長さ、ストライド
(クラス)