std::generator
ja.cppreference.net より
| ヘッダ <generator>
|
||
template<
class Ref,
class V = void,
class Allocator = void >
class generator
: public ranges::view_interface<generator<Ref, V, Allocator>>
|
で定義 (1) | (C++23 から) |
namespace pmr {
template< class Ref, class V = void >
using generator =
std::generator<Ref, V, std::pmr::polymorphic_allocator<>>;
}
|
(2) | (C++23 から) |
std::generator は、コルーチンから返された後にそのコルーチンを再開することで要素のシーケンスを生成します。
co_yield 文が評価されるたびに、コルーチンはシーケンスの1つの要素を生成します。
co_yield 文が co_yield ranges::elements_of(rng) の形式である場合、範囲 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) |
|
以下から継承ranges::view_interface | |
| 派生ビューが空かどうかを返します。ただし、それがsized_range または forward_range を満たす場合に限ります( std::ranges::view_interface<D>のパブリックメンバ関数)
| |
(C++23) |
範囲の先頭を指す定数イテレータを返します ( std::ranges::view_interface<D>のパブリックメンバ関数)
|
(C++23) |
範囲の定数イテレータの番兵を返します ( std::ranges::view_interface<D>のパブリックメンバ関数)
|
| 派生ビューが空でないかどうかを返します。ただし、ranges::empty がそれに適用可能な場合に限ります ( std::ranges::view_interface<D>のパブリックメンバ関数)
| |
ネストされたクラス
|
プロミス型
(公開メンバークラス) |
|
|
イテレータ型
( 説明専用メンバークラス* ) |
注記
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__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)
|
再開または破棄されたときに観測可能な効果を持たないコルーチンハンドルを作成する
(関数) |