std::generator

来自cppreference.com
< cpp‎ | coroutine
 
 
工具库
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (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++17)
(C++17)
 
协程支持
协程特征
协程柄
无操作协程
平凡可等待体
 
范围库
范围访问
范围转换器
(C++23)
范围原语



悬垂迭代器处理
范围概念
视图

范围工厂
适配器
范围生成器
std::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 添加特化的程序行为未定义。

数据成员

active_ (私有)

每个 std::generator 的活动实例内部都关联一个栈(如同以类型 std::unique_ptr<std::stack<std::coroutine_handle<>>> 的对象持有)。

  • 当调用 begin 时,建立新栈且将该生成器加入到这个栈中。
  • co_yield ranges::elements_of(rng) 语句在生成器体中求值时,将 rng 转换为生成器且加入到包含外围生成器的栈中。
  • 当生成器的迭代器自增时,恢复关联栈栈顶的协程。
  • 当生成器完成时 (也就是 final_suspend 被调用时),从此栈中移除它。
    (仅用于阐述的成员对象*)
coroutine_ (私有) std::coroutine_handle<promise_type>
(仅用于阐述的成员对象*)

模板形参

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

Allocator 不是 void,则:

成员类型

成员类型 定义
yielded std::conditional_t<std::is_reference_v<T>, T, const T&>
value (私有) std::conditional_t<std::is_void_v<V>, std::remove_cvref_t<Ref>, V>;
value 是一个无 cv 限定对象类型。
(仅用于阐述的成员类型*)
reference (私有) std::conditional_t<std::is_void_v<V>, Ref&&, Ref>;
reference 或是引用类型,或是实现了 copy_constructible 的无 cv 限定类型。
(仅用于阐述的成员类型*)

/*RRef*/ 表示:

实现如下概念:

成员函数

构造一个 generator 对象
(公开成员函数)
有效率的销毁整个已生成的 generator
(公开成员函数)
赋值一个 generator 对象
(公开成员函数)
恢复起初暂停的协程并返回指向他句柄的迭代器
(公开成员函数)
返回 std::default_sentinel
(公开成员函数)
继承自 std::ranges::view_interface
(C++20)
返回视图是否为空。若视图满足 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 – 适用于范围的同步协程生成器

示例

#include <generator>
#include <ranges>
#include <iostream>
 
std::generator<char> letters(char first)
{
    for (;; co_yield first++);
}
 
int main()
{
    for (const char ch : letters('a') | std::views::take(26))
        std::cout << ch << ' ';
    std::cout << '\n';
}

输出:

a b c d e f g h i j k l m n o p q r s t u v w x y z

引用

  • C++23 标准(ISO/IEC 14882:2023):
  • 26.8 Range generators [coro.generator]

参阅

创建在等待或销毁时无可观察作用的协程柄
(函数)