std:: generator
|
ヘッダーで定義
<generator>
|
||
|
template
<
class
Ref,
|
(1) | (C++23以降) |
|
namespace
pmr
{
template
<
class
Ref,
class
V
=
void
>
|
(2) | (C++23以降) |
generator
のための便利なエイリアステンプレート。
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 |
| Allocator | - | アロケータ型、または 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
&
>
|
| 型要件 | ||
|
-
|
||
-
value
はCV修飾されていないオブジェクト型である。
|
||
-
reference
は参照型、または
copy_constructible
をモデル化するCV修飾されていないオブジェクト型のいずれかである。
|
||
-
RRef
を
std::
remove_reference_t
<
reference
>
&&
と定義する(
reference
が参照型の場合)。参照型でない場合は
reference
とする。
|
これらの型要件のいずれかが満たされない場合、プログラムは不適格です。
データメンバ
| メンバー | 定義 |
active_
(非公開)
|
内部的に、各アクティブな
|
coroutine_
(非公開)
|
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 member function)
|
|
|
(C++23)
|
範囲の先頭を指す定数イテレータを返す
(
std::ranges::view_interface<D>
のpublic member function)
|
|
(C++23)
|
範囲の定数イテレータの番兵を返す
(
std::ranges::view_interface<D>
のpublic member function)
|
|
派生ビューが空でないかどうかを返す(
ranges::empty
が適用可能な場合のみ提供)
(
std::ranges::view_interface<D>
のpublic member function)
|
|
ネストされたクラス
|
プロミス型
(公開メンバークラス) |
|
|
イテレータ型
( 説明専用メンバークラス* ) |
注記
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_generator
|
202207L
|
(C++23) |
std::generator
– 同期
コルーチン
ジェネレータ for
レンジ
|
例
#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)
|
再開または破棄されたときに観測可能な効果を持たないコルーチンハンドルを作成する
(関数) |