std::ranges::get(std::ranges::subrange)
From cppreference.com
| ヘッダ <ranges> で定義 |
||
template< std::size_t N, class I, class S, ranges::subrange_kind K > requires ((N == 0 && std::copyable<I>) || N == 1) |
(1) | (C++20以降) |
| template< std::size_t N, class I, class S, ranges::subrange_kind K > requires (N < 2) |
(2) | (C++20以降) |
| namespace std { using ranges::get; } |
(3) | (C++20以降) |
構造化束縛をサポートします。
1) N == 0 または N == 1 の場合、
subrange の左辺値 (または const 右辺値) からイテレータまたはセンチネルを取得します。2) (1) と同じですが、非 const の
subrange 右辺値を受け取ります。目次 |
[編集] パラメータ
| r | - | subrange |
[編集] 戻り値
1,2) N が 0 の場合は r.begin() を返します。それ以外の場合 (N が 1 の場合) は r.end() を返します。
[編集] 例
このコードを実行
#include <array> #include <iostream> #include <iterator> #include <ranges> int main() { std::array a{1, -2, 3, -4}; std::ranges::subrange sub_a{std::next(a.begin()), std::prev(a.end())}; std::cout << *std::ranges::get<0>(sub_a) << ' ' // == *(begin(a) + 1) << *std::ranges::get<1>(sub_a) << '\n'; // == *(end(a) - 1) *std::get<0>(sub_a) = 42; // OK // *std::get<2>(sub_a) = 13; // Error: index can only be 0 or 1 }
出力
-2 -4
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3589 | C++20 | オーバーロード (1) は、N が 0 の場合に begin_ をコピーしますが、I は copyable をモデル化しない場合があります。 |
制約が追加されました。 |
[編集] 関連項目
| 構造化束縛 (C++17) | 指定された名前を初期化子のサブオブジェクトまたはタプル要素に束縛します |
| (C++11) |
tuple は指定された要素にアクセスする (関数テンプレート) |
| (C++11) |
pairの要素にアクセスする(関数テンプレート) |
| (C++11) |
array の要素にアクセスする(関数テンプレート) |
| (C++17) |
インデックスまたは型(型が一意である場合)を指定して variant の値を読み取る。エラーの場合は例外をスローする (function template) |
| (C++26) |
std::complex から実部または虚部への参照を取得します (関数テンプレート) |