std::ranges::views::elements, std::ranges::elements_view
| ヘッダ <ranges> で定義 |
||
| template< ranges::input_range V, std::size_t N > requires ranges::view<V> && |
(1) | (C++20以降) |
| namespace views { template< std::size_t N > |
(2) | (C++20以降) |
| 呼び出しシグネチャ |
||
| template< ranges::viewable_range R > requires /* 以下を参照 */ |
(C++20以降) | |
| ヘルパーコンセプト |
||
| (3) | ||
template< class T, std::size_t N > concept /*has-tuple-element*/ = |
(C++23まで) (説明用*) |
|
| template< class T, std::size_t N > concept /*has-tuple-element*/ = |
(C++23から) (説明用*) |
|
| template< class T, std::size_t N > concept returnable-element = |
(4) | (説明用*) |
views::elementsのすべての特殊化はRangeAdaptorObjectです。式 views::elements<M>(e)は、任意の適切な部分式 e および定数式 Mに対して、 elements_view<views::all_t<decltype((e))>, M>{e}と式同値になります。elements_viewは、基になるビューVが対応するコンセプトをモデルとする場合、random_access_range、bidirectional_range、forward_range、input_range、common_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_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>> = |
(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です基になるビューがそうである場合 |
| LWG 3502 | C++20 | elements_viewからダングリング参照を取得する可能性がありました |
そのような使用は禁止されています |
[編集] 関連項目
| (C++20) |
ペアのような値からなるviewを取り、各ペアの最初の要素のviewを生成する(クラステンプレート) (rangeアダプタオブジェクト) |
ペアのような値からなるviewを取り、各ペアの2番目の要素のviewを生成する(クラステンプレート) (rangeアダプタオブジェクト) | |
| (C++23) |
適合するviewの対応する要素への参照のタプルからなる view(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
適合するviewの対応する要素に変換関数を適用した結果からなる view(クラステンプレート) (カスタマイゼーションポイントオブジェクト) | |
| valarrayのBLAS風スライス: 開始インデックス、長さ、ストライド (class) |