std::ranges::views::zip_transform, std::ranges::zip_transform_view
| ヘッダ <ranges> で定義 |
||
| template< std::move_constructible F, ranges::input_range... Views > requires (ranges::view<Views> && ...) && (sizeof...(Views) > 0) && |
(1) | (C++23から) |
| namespace views { inline constexpr /*unspecified*/ zip_transform = /*unspecified*/; |
(2) | (C++23から) |
| 呼び出しシグネチャ |
||
| template< class F, ranges::viewable_range... Rs > requires /* 以下を参照 */ |
(C++23から) | |
zip_transform_view は、呼び出し可能なオブジェクトと1つ以上の view を受け取り、呼び出し可能なオブジェクトをすべてのビューの i 番目の要素に適用した結果を i 番目の要素とする view を生成するレンジアダプタである。型
T が公開専用の概念 /*can-reference*/ をモデルするのは、T& が有効な型である場合に限られる。views::zip_transform はカスタマイゼーションポイントオブジェクトである。引数を1つ f として呼び出すとき、FD を std::decay_t<decltype(f)> とする。もし
-
FDがcopy_constructibleをモデルし、 - FD& が
regular_invocableをモデルし、かつ - std::invoke_result_t<FD&> がオブジェクト型であるならば、
views::zip_transform(f) は 式として等価 である ((void)f, auto(views::empty<std::decay_t<std::invoke_result_t<FD&>>>))。それ以外の場合、views::zip_transform の呼び出しは不適格である。
zip_transform_view は、基になる ranges::zip_view<Views...> がそれぞれの概念をモデルする場合、random_access_range、bidirectional_range、forward_range、input_range、common_range、および sized_range の概念をモデルする。
目次 |
カスタマイゼーションポイントオブジェクト
名前 views::zip_transform は、カスタマイゼーションポイントオブジェクト を表す。これは、リテラルな semiregular クラス型の const 関数オブジェクトである。説明の目的上、その型の cv-非修飾バージョンは __zip_transform_fn と表記される。
__zip_transform_fn のすべてのインスタンスは等しい。異なる型のインスタンス __zip_transform_fn を同じ引数で呼び出した際の効果は、インスタンスを表す式がlvalueかrvalueか、const修飾されているかどうかにかかわらず等しい(ただし、volatile修飾されたインスタンスは呼び出し可能である必要はない)。したがって、views::zip_transform は自由にコピーでき、そのコピーは互換的に使用できる。
型の集合 Args... が与えられたとき、もし std::declval<Args>()... が上記の views::zip_transform の引数の要件を満たすならば、__zip_transform_fn は
- std::invocable<__zip_transform_fn, Args...>,
- std::invocable<const __zip_transform_fn, Args...>,
- std::invocable<__zip_transform_fn&, Args...>、および
- std::invocable<const __zip_transform_fn&, Args...>.
をモデルする。それ以外の場合、__zip_transform_fn の関数呼び出し演算子はいずれもオーバーロード解決に参加しない。
[編集] メンバ関数
zip_transform_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 メンバ関数) | |
[編集] 推論ガイド
[編集] メンバ型
| メンバ型 | 定義 |
InnerView (プライベート) |
ranges::zip_view<Views...>. (説明専用メンバ型*) |
ziperator (プライベート) |
|
zentinel (プライベート) |
|
[編集] データメンバ
| メンバオブジェクト | 定義 |
zip_ (プライベート) |
型 InnerView の基になるビューオブジェクト(説明用のメンバオブジェクト*) |
fun_ (プライベート) |
型 movable-box<F> のラップされた呼び出し可能なオブジェクト(説明用のメンバオブジェクト*) |
[編集] 入れ子クラス
| イテレータ型 (説明専用メンバクラステンプレート*) | |
基になる zip_view が common_range でない場合に使用される番兵型(説明専用メンバクラステンプレート*) |
[編集] 注釈
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_ranges_zip |
202110L |
(C++23) | ranges::zip_view,std::ranges::zip_transform_view,ranges::adjacent_view, ranges::adjacent_transform_view |
[編集] 例
#include <array> #include <iostream> #include <list> #include <ranges> #include <vector> void print(auto const rem, auto const& r) { std::cout << rem << '{'; for (char o[]{0,' ',0}; auto const& e : r) std::cout << o << e, *o = ','; std::cout << "}\n"; } int main() { auto v1 = std::vector<float>{1, 2, 3}; auto v2 = std::list<short>{1, 2, 3, 4}; auto v3 = std::to_array({1, 2, 3, 4, 5}); auto add = [](auto a, auto b, auto c) { return a + b + c; }; auto sum = std::views::zip_transform(add, v1, v2, v3); print("v1: ", v1); print("v2: ", v2); print("v3: ", v3); print("sum: ", sum); }
出力
v1: {1, 2, 3}
v2: {1, 2, 3, 4}
v3: {1, 2, 3, 4, 5}
sum: {3, 6, 9}[編集] 関連項目
| (C++23) |
適合するviewの対応する要素への参照のタプルからなる view(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
各要素に変換関数を適用するシーケンスの view(クラステンプレート) (rangeアダプタオブジェクト) | |
tuple-like な値からなるviewと数値Nを取り、各タプルのN番目の要素のviewを生成する(クラステンプレート) (rangeアダプタオブジェクト) |