Namespaces
Variants

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

ja.cppreference.net より
 
 
Ranges ライブラリ
Range アダプタ
 
 
ヘッダ <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)
namespace views {
    template< std::size_t N >
    constexpr /* unspecified */ elements = /* unspecified */;
}
(C++20 以上) (2)
(C++20 以上)
template< ranges::viewable_range R >
    requires /* see below */
constexpr ranges::view auto elements<N>( R&& r );
呼び出しシグネチャ
(C++20 以上)
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>&>;
    };
ヘルパコンセプト (3)
(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) タプル的な値のviewNを受け取り、適応された view の値型の番目
の要素を値型とする view を生成します。2)views::elements のすべての特殊化はRangeAdaptorObjectです。式 views::elements<M>(e) は、任意の適切な部分式 と定数式 に対して、elements_view<views::all_t<decltype((e))>, M>{e} とe式等価Mです。
3) 元となる view の要素がタプル的な値であることを保証します。 tuple-like(C++23 以上)を参照。
4) ダングリング参照が返されないことを保証します。

elements_view は、元となる view がそれぞれのコンセプトをモデル化する場合に、random_access_range、bidirectional_range、forward_range、input_range、common_range、sized_rangeV の各コンセプトをモデル化します。

データメンバ

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

メンバー関数

elements_viewを構築する
(公開メンバ関数)
基となる(アダプトされた)ビューのコピーを返す
(公開メンバ関数)
先頭を指すイテレータを返す
(公開メンバ関数)
終端を指すイテレータまたは番兵を返す
(公開メンバ関数)
要素数を返す(基となる(アダプトされた)範囲が sized_range を満たす場合にのみ提供)
(公開メンバ関数)
結果の approximately_sized_range の近似サイズを返す
(公開メンバ関数)
ranges::view_interface
empty派生ビューが空かどうかを返す。ただし、それが sized_range または
forward_rangestd::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番目の要素を返す。ただし、それが 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ライクなスライス:開始インデックス、長さ、ストライド
(クラス)