std::generator
来自 cppreference.cn
在头文件 <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
添加特化,则行为未定义。
目录 |
[编辑] 模板形参
Ref | - | 生成器的引用类型 (ranges::range_reference_t)。如果 V 为 void,则引用类型和值类型都从 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_ (私有) |
在内部,
|
coroutine_ (私有) |
类型为 std::coroutine_handle<promise_type> 的句柄 (仅用于说明的成员对象*) |
[编辑] 成员函数
构造 generator 对象(公有成员函数) | |
有效地销毁整个已产生 generator 的栈(公有成员函数) | |
赋值 generator 对象(公有成员函数) | |
恢复初始挂起的协程,并返回指向其句柄的迭代器 (公有成员函数) | |
返回 std::default_sentinel (公有成员函数) | |
继承自 std::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> 的公有成员函数) |
[编辑] 嵌套类
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]
[编辑] 参见
(C++20) |
创建在恢复或销毁时没有可观察效果的协程句柄 (函数) |