std::generator
来自cppreference.com
在标头 <generator> 定义
|
||
template< class Ref, |
(1) | (C++23 起) |
namespace pmr { template< class Ref, class V = void > |
(2) | (C++23 起) |
std::generator
通过反复恢复可返回值的协程以生成元素序列。
每当 co_yield 语句被求值,协程产生序列的一个元素。
当 co_yield 语句具有形式 co_yield ranges::elements_of(rng) 时,range
rng 中的每个元素作为序列的一个元素被依次生成。
std::generator
实现 view
及 input_range
。
为 std::generator
添加特化的程序行为未定义。
数据成员
active_ (私有)
|
每个
|
coroutine_ (私有)
|
std::coroutine_handle<promise_type> (仅用于阐述的成员对象*) |
模板形参
Ref | - | 生成器的引用类型(ranges::range_reference_t)。 如果 V 是 void,则值类型和引用类型均从 Ref 推导
|
V | - | 生成器的值类型 (range_value_t ),或者为 void
|
Allocator | - | 分配器类型或者 void |
若 Allocator
不是 void,则:
- std::allocator_traits<Allocator>::pointer 是指针类型,且
-
Allocator
满足 分配器 (Allocator) 的要求。
成员类型
成员类型 | 定义 |
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*/ 表示:
- std::remove_reference_t</*reference*/>&&,若 /*reference*/ 是引用类型,否则是
- /*reference*/。
实现如下概念:
- std::common_reference_with</*reference*/&&, /*value*/&>,
- std::common_reference_with</*reference*/&&, /*RRef*/&&>,以及
- std::common_reference_with</*RRef*/&&, const /*value*/&>。
成员函数
构造一个 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> 的公开成员函数) |
(C++20) |
返回派生视图是否为非空。若 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]
参阅
(C++20) |
创建在等待或销毁时无可观察作用的协程柄 (函数) |