Namespaces
Variants

std::generator

ja.cppreference.net より
 
 
ユーティリティライブラリ
言語サポート
型サポート (基本型、RTTI)
ライブラリ機能テストマクロ (C++20)
プログラムユーティリティ
可変引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20 で非推奨)
整数比較関数
(C++20)(C++20)(C++20)    
(C++20)
swap および 型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
共通の語彙型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
コルーチンサポート
コルーチントレイト
コルーチンハンドル
ノーオペレーションコルーチン
自明な待機可能オブジェクト
範囲ジェネレータ
(C++23)
 
Ranges ライブラリ
範囲アダプタ
 
 
ヘッダ <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 は、コルーチンの評価によって生成される要素のビューを表現します。
2) generator を 多相アロケータ で使用するための便利なエイリアステンプレート。

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  & >
型要件
-
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)
以下から継承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]

関連項目

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