Namespaces
Variants

std:: generator

From cppreference.net
Utilities library
Coroutine support
Coroutine traits
Coroutine handle
No-op coroutines
Trivial awaitables
Range generators
generator
(C++23)
Ranges library
Range adaptors
ヘッダーで定義 <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以降)
1) クラステンプレート std::generator は、 view を提供し、 コルーチン の評価によって生成される要素のビューを表現します。
2) ポリモーフィックアロケータを使用する 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  & >
型要件
-
std:: allocator_traits < Allocator > :: pointer はポインタ型である。
-
value はCV修飾されていないオブジェクト型である。
-
reference は参照型、または copy_constructible をモデル化するCV修飾されていないオブジェクト型のいずれかである。
-
RRef std:: remove_reference_t < reference  > && と定義する( reference が参照型の場合)。参照型でない場合は reference とする。

これらの型要件のいずれかが満たされない場合、プログラムは不適格です。

データメンバ

メンバー 定義
active_ (非公開)

内部的に、各アクティブな std::generator インスタンスはスタック( std:: unique_ptr < std:: stack < std:: coroutine_handle <>>> 型のオブジェクトによって処理される)に関連付けられる。

  • begin が呼び出されると、新しいスタックが作成され、ジェネレータがスタックに追加される。
  • ジェネレータ本体で co_yield ranges :: elements_of ( rng ) が評価されると、 rng がジェネレータに変換され、外側のジェネレータを含むスタックに追加される。
  • ジェネレータイテレータが インクリメント されると、関連付けられたスタックの最上位のコルーチンが再開される。
  • ジェネレータが終了すると(すなわち promise_type::final_suspend が呼び出されると)、スタックから削除される。
    説明専用メンバーオブジェクト*
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]

関連項目

再開または破棄されたときに観測可能な効果を持たないコルーチンハンドルを作成する
(関数)