名前空間
変種
操作

std::generator

From cppreference.com
< cpp‎ | coroutine
 
 
ユーティリティライブラリ
言語サポート
型のサポート (基本型、RTTI)
ライブラリ機能検査マクロ (C++20)
プログラムユーティリティ
可変引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
 
コルーチンサポート
コルーチントレイト
コルーチンハンドル
No-opコルーチン
自明なawaitable
Rangeジェネレータ
generator
(C++23)
 
Rangesライブラリ
Rangeアダプタ
 
 
ヘッダー <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 は、コルーチンの評価によって生成 (yield) された要素の view を提供します。
2) 多相アロケーターを使用する generator のための便利なエイリアステンプレートです。

std::generator は、それが返されたコルーチンを繰り返し再開することで要素のシーケンスを生成します。co_yield 文が評価されるたびに、コルーチンはシーケンスの1つの要素を生成します。co_yield 文が co_yield ranges::elements_of(rng) の形式である場合、range rng の各要素が、シーケンスの要素として順次生成されます。

std::generatorviewinput_range をモデル化します。

std::generator の特殊化を追加するプログラムの振る舞いは未定義です。

目次

[編集] テンプレートパラメータ

Ref - ジェネレータの参照型 (ranges::range_reference_t)。もし Vvoid ならば、参照型と値型の両方が Ref から推論される
V - ジェネレータの値型 (ranges::range_value_t)、または void
アロケータ - アロケーター型、または void

もし Allocatorvoid でない場合、AllocatorAllocator 要件を満たさなければ、振る舞いは未定義です。

[編集] メンバ型

メンバ 定義
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)

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

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

[編集]

#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]

[編集] 関連項目

再開または破棄されても観測可能な効果がないコルーチンハンドルを作成する
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)