命名空间
变体
操作

std::generator

来自 cppreference.cn
< cpp‎ | 协程
 
 
 
协程支持
协程特性
协程句柄
空操作协程
平凡可等待对象
范围生成器
generator
(C++23)
 
范围库
范围适配器
 
 
在头文件 <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 语句时,协程产生序列的一个元素。当 co_yield 语句的形式为 co_yield ranges::elements_of(rng) 时,range rng 的每个元素都相继作为序列的一个元素产生。

std::generator 建模 viewinput_range

如果程序为 std::generator 添加特化,则行为未定义。

目录

[编辑] 模板形参

Ref - 生成器的引用类型 (ranges::range_reference_t)。如果 Vvoid,则引用类型和值类型都从 Ref 推导
V - 生成器的值类型 (ranges::range_value_t),或 void
Allocator - 分配器类型或 void

如果 Allocator 不是 void,则如果 Allocator 不满足 Allocator 要求,则行为未定义。

[编辑] 成员类型

成员 定义
value (私有) std::conditional_t<std::is_void_v<V>, std::remove_cvref_t<Ref>, V>;
(仅用于说明的成员类型*)
reference (私有) 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 对象
(公有成员函数) [编辑]
有效地销毁整个已产生 generator 的栈
(公有成员函数) [编辑]
赋值 generator 对象
(公有成员函数) [编辑]
恢复初始挂起的协程,并返回指向其句柄的迭代器
(公有成员函数) [编辑]
返回 std::default_sentinel
(公有成员函数) [编辑]
继承自 std::ranges::view_interface
返回导出的视图是否为空,仅当它满足 sized_rangeforward_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> 的公有成员函数) [编辑]

[编辑] 嵌套类

promise 类型
(公有成员类)
迭代器类型
(仅用于说明的成员类*)

[编辑] 注解

特性测试 Std 特性
__cpp_lib_generator 202207L (C++23) std::generator – 用于 范围 的同步协程生成器

[编辑] 示例

#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 范围生成器 [coro.generator]

[编辑] 参见

创建在恢复或销毁时没有可观察效果的协程句柄
(函数) [编辑]