名前空間
変種
操作

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

From cppreference.com
< cpp‎ | ranges
 
 
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) (C++20以降)
namespace views {

    template< std::size_t N >
    constexpr /* unspecified */ elements = /* unspecified */;

}
(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)は、任意の適切な部分式 e および定数式 Mに対して、 elements_view<views::all_t<decltype((e))>, M>{e}式同値になります。
3) 基になるビューの要素がタプルライクな値であることを保証しますtuple-likeを参照)(C++23以降)
4) ダングリング参照が返されないことを保証します。

elements_viewは、基になるビューVが対応するコンセプトをモデルとする場合、random_access_rangebidirectional_rangeforward_rangeinput_rangecommon_range、およびsized_rangeのコンセプトをモデル化します。

目次

[編集] データメンバー

メンバ名 定義
base_ (プライベート) 基になる(アダプトされた)ビュー、型はV
(説明用のメンバオブジェクト*)

[編集] メンバー関数

elements_viewを構築します
(public メンバ関数) [編集]
基になる(適応された)ビューのコピーを返す
(public member function) [編集]
先頭へのイテレータを返す
(public メンバ関数) [編集]
終端へのイテレータまたはセンチネルを返す
(public メンバ関数) [編集]
基底(アダプトされた)レンジが 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_rangecommon_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_viewborrowed_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_viewborrowed_rangeではありませんでした borrowed_rangeです
基になるビューがそうである場合
LWG 3502 C++20 elements_viewからダングリング参照を取得する可能性がありました そのような使用は禁止されています

[編集] 関連項目

ペアのような値からなるviewを取り、各ペアの最初の要素のviewを生成する
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
ペアのような値からなるviewを取り、各ペアの2番目の要素のviewを生成する
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
適合するviewの対応する要素への参照のタプルからなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)[編集]
適合するviewの対応する要素に変換関数を適用した結果からなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)[編集]
valarrayのBLAS風スライス: 開始インデックス、長さ、ストライド
(class) [編集]
English 日本語 中文(简体) 中文(繁體)