std::ranges::views::concat, std::ranges::concat_view
| ヘッダ <ranges> で定義 |
||
| template< ranges::input_range... Views > requires (ranges::view<Views> && ...) && (sizeof...(Views) > 0) && |
(1) | (C++26以降) |
| namespace views { inline constexpr /* unspecified */ concat = /* unspecified */; |
(2) | (C++26以降) |
| 呼び出しシグネチャ |
||
| template< ranges::viewable_range... Rs > requires /* 以下を参照 */ |
(C++26以降) | |
| ヘルパー型エイリアス |
||
template< class... Rs > using /*concat-reference-t*/ = |
(3) | (説明用*) |
template< class... Rs > using /*concat-value-t*/ = std::common_type_t<ranges::range_value_t<Rs>...>; |
(4) | (説明用*) |
template< class... Rs > using /*concat-rvalue-reference-t*/ = |
(5) | (説明用*) |
| ヘルパーコンセプト |
||
template< class Ref, class RRef, class It > concept /*concat-indirectly-readable-impl*/ = /* see description */; |
(6) | (説明用*) |
template< class... Rs > concept /*concatable*/ = /* see description */; |
(7) | (説明用*) |
concat_view は、任意の数のレンジを引数リストとして受け取る view ファクトリを提供します。これは、最初のレンジの最初の要素から始まり、最後のレンジの最後の要素で終わるビューを提供し、すべてのレンジの要素は、引数で与えられた順序で効果的に連結され、つまり引数レンジが連鎖します。
views::concat はカスタマイズポイントオブジェクトです。サブ式のパック exprs が与えられた場合、式 views::concat(exprs...) は、exprs が input_range をモデル化する単一の要素のパックである場合は
- views::all(exprs...) に、それ以外の場合は
- concat_view(exprs...) に 式同値です。
value_type をさらに尊重する iterator::value_type。iter_move をカスタマイズするケースも正しくサポートする rvalue 参照。template< class... Rs > concept /*concat-indirectly-readable*/ = // exposition only std::common_reference_with</*concat-reference-t*/<Rs...>&&, /*concat-value-t*/<Rs...>&> && std::common_reference_with</*concat-reference-t*/<Rs...>&&, /*concat-rvalue-reference-t*/<Rs...>&&> && std::common_reference_with</*concat-rvalue-reference-t*/<Rs...>&&, /*concat-value-t*/<Rs...> const&> && (/*concat-indirectly-readable-impl*/</*concat-reference-t*/<Rs...>, /*concat-rvalue-reference-t*/<Rs...>, ranges::iterator_t<Rs>> && ...);
template< class Ref, class RRef, class It > concept /*concat-indirectly-readable-impl*/ = // exposition only requires(const It it) { { *it } -> std::convertible_to<Ref>; { ranges::iter_move(it)} -> std::convertible_to<RRef>; };
template< class... Rs > concept /*concatable*/ = requires { // exposition only typename /*concat-reference-t*/<Rs...>; typename /*concat-value-t*/<Rs...>; typename /*concat-rvalue-reference-t*/<Rs...>; } && /*concat-indirectly-readable*/<Rs...>;
concat_view は常に input_range をモデル化し、アダプトされた各 view 型が対応するコンセプトをモデル化する場合、forward_range、bidirectional_range、random_access_range、または sized_range をモデル化します。
最後の基底レンジが common_range をモデル化する場合、concat_view は common_range になり得ます。
目次 |
カスタマイゼーションポイントオブジェクト
views::concat という名前は、const FunctionObject であり、LiteralType の semiregular クラス型の *カスタマイズポイントオブジェクト* を指します。exposition の目的で、その型の cv-unqualified バージョンは __concat_fn と表記されます。
すべての __concat_fn のインスタンスは等価です。異なる __concat_fn 型のインスタンスを同じ引数で呼び出す効果は、インスタンスを表す式が lvalue か rvalue か、また cv 修飾されているかどうかにかかわらず同等です(ただし、volatile 修飾されたインスタンスは呼び出し可能である必要はありません)。したがって、views::concat は自由にコピーでき、そのコピーは互換性があります。
型のセット Args... が与えられた場合、std::declval<Args>()... が上記の views::concat への引数の要件を満たす場合、__concat_fn は以下をモデル化します。
- std::invocable<__concat_fn, Args...>,
- std::invocable<const __concat_fn, Args...>,
- std::invocable<__concat_fn&, Args...>、および
- std::invocable<const __concat_fn&, Args...>.
それ以外の場合、__concat_fn の関数呼び出し演算子のいずれもオーバーロード解決に参加しません。
[edit] データメンバー
| メンバ | 説明 |
std::tuple<Views...> views_ |
すべての適応されたビューオブジェクト (説明用のメンバオブジェクト*) |
[edit] メンバ関数
concat_view を構築します(public メンバ関数) | |
| 先頭へのイテレータを返す (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 メンバ関数) | |
[edit] 推論ガイド
[edit] ネストされたクラス
| クラス名 | 定義 |
| イテレータ型 (説明専用メンバクラステンプレート*) |
[edit] ヘルパーテンプレート
concat_view のための ranges::enable_borrowed_range の特殊化は存在しません。これは、イテレータの実装が、常にすべての基底レンジのすべてのイテレータとセンチネルのコピーを含む必要があるためです。
[edit] 注記
引数なしの views::concat() は ill-formed です。なぜなら、要素型 T を決定する合理的な方法がないためです。単一引数の views::concat(r) は views::all(r) と式同値です。
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_ranges_concat |
202403L |
(C++26) | std::ranges::concat_view
|
[edit] 例
予備版は Compiler Explorer で確認できます。
#include <cassert> #include <list> #include <print> #include <ranges> #include <vector> int main() { std::vector<int> v0{1, 2, 3}, v1{4, 5}; int a[]{6, 7}; int i{8}; auto ie{std::views::single(i)}; auto con = std::views::concat(v0, v1, a, ie); assert(con.size() == v0.size() + v1.size() + std::size(a) + ie.size()); std::println("con.size(): {}", con.size()); std::println("con: {}", con); con[6] = 42; // con is random_access_range, operator[] returns a reference assert(a[1] == 42); // a[1] was modified via con[6] std::println("con: {}", con); std::list<int> l{7, 8}; // list is bidirectional range auto cat = std::views::concat(v0, l); std::println("cat: {}", cat); // cat[0] = 13; // compile-time error: cat is bidirectional => no operator[] }
出力
con.size(): 8 con: [1, 2, 3, 4, 5, 6, 7, 8] con: [1, 2, 3, 4, 5, 6, 42, 8] cat: [1, 2, 3, 7, 8]
[edit] 参照
- C++26 標準 (ISO/IEC 14882:2026)
- 26.7.18 Concat view [range.concat]
[edit] 関連項目
| (C++20) |
rangeのviewをフラット化して得られるシーケンスからなる view(クラステンプレート) (rangeアダプタオブジェクト) |
rangeのviewをフラット化し、要素の間に区切り文字を挟んで得られるシーケンスからなる view(クラステンプレート) (rangeアダプタオブジェクト) | |
| (C++23) |
適合するviewの対応する要素への参照のタプルからなる view(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
適合するviewのn項デカルト積によって計算された結果のタプルからなる view(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |