std::generator
From cppreference.com
| ヘッダー <generator> で定義 |
||
| template< class Ref, |
(1) | (C++23から) |
| namespace pmr { template< class Ref, class V = void > |
(2) | (C++23から) |
std::generator は、それが返されたコルーチンを繰り返し再開することで要素のシーケンスを生成します。co_yield 文が評価されるたびに、コルーチンはシーケンスの1つの要素を生成します。co_yield 文が co_yield ranges::elements_of(rng) の形式である場合、range rng の各要素が、シーケンスの要素として順次生成されます。
std::generator は view と input_range をモデル化します。
std::generator の特殊化を追加するプログラムの振る舞いは未定義です。
目次 |
[編集] テンプレートパラメータ
| Ref | - | ジェネレータの参照型 (ranges::range_reference_t)。もし V が void ならば、参照型と値型の両方が Ref から推論される |
| V | - | ジェネレータの値型 (ranges::range_value_t)、または void |
| アロケータ | - | アロケーター型、または void |
もし Allocator が void でない場合、Allocator が Allocator 要件を満たさなければ、振る舞いは未定義です。
[編集] メンバ型
| メンバ | 定義 |
value (private) |
std::conditional_t<std::is_void_v<V>, std::remove_cvref_t<Ref>, V>; (説明専用メンバ型*) |
reference (private) |
std::conditional_t<std::is_void_v<V>, Ref&&, Ref>; (説明専用メンバ型*) |
yielded |
std::conditional_t<std::is_reference_v<reference >, reference, const reference &>
|
| 型要件 | ||
| -std::allocator_traits<Allocator>::pointer はポインタ型です。 | ||
-value はCV修飾されていないオブジェクト型です。 | ||
-reference は参照型、または copy_constructible をモデル化するCV修飾されていないオブジェクト型です。 | ||
-RRef を、もし reference が参照型ならば std::remove_reference_t<reference >&& を、そうでなければ reference を表すものとします。
|
これらの型要件のいずれかが満たされない場合、プログラムは不適格となります。
[編集] データメンバ
| メンバ | 定義 |
active_ (private) |
内部的には、
|
coroutine_ (private) |
std::coroutine_handle<promise_type> 型のハンドル (説明用のメンバオブジェクト*) |
[編集] メンバ関数
generator オブジェクトを構築する(public member function) | |
生成された generator のスタック全体を効果的に破棄する(public member function) | |
generator オブジェクトを代入する(public member function) | |
| 初期状態で中断しているコルーチンを再開し、そのハンドルへのイテレータを返す (public member function) | |
| std::default_sentinel を返す (public member function) | |
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 メンバ関数) | |
[編集] ネストされたクラス
| promise 型 (public メンバクラス) | |
| イテレータ型 (説明専用メンバクラス*) |
[編集] ノート
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_generator |
202207L |
(C++23) | std::generator – ranges のための同期コルーチンジェネレータ |
[編集] 例
このコードを実行
#include <generator> #include <iostream> template<typename T> struct Tree { T value; Tree *left{}, *right{}; std::generator<const T&> traverse_inorder() const { if (left) co_yield std::ranges::elements_of(left->traverse_inorder()); co_yield value; if (right) co_yield std::ranges::elements_of(right->traverse_inorder()); } }; int main() { Tree<char> tree[] { {'D', tree + 1, tree + 2}, // │ // ┌───────────────┴────────────────┐ // │ │ {'B', tree + 3, tree + 4}, {'F', tree + 5, tree + 6}, // │ │ // ┌─────────┴─────────────┐ ┌───────────┴─────────────┐ // │ │ │ │ {'A'}, {'C'}, {'E'}, {'G'} }; for (char x : tree->traverse_inorder()) std::cout << x << ' '; std::cout << '\n'; }
出力
A B C D E F G
[編集] 参照
- C++23標準 (ISO/IEC 14882:2024)
- 26.8 Range generators [coro.generator]
[編集] 関連項目
| (C++20) |
再開または破棄されても観測可能な効果がないコルーチンハンドルを作成する (関数) |