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
添加特化的程序行为未定义。
目录 |
[编辑]模板形参
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 是引用类型或者无 cv 限定的实现 copy_constructible 的对象类型。 | ||
-令 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 | |
返回视图是否为空,仅当视图满足 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 <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]
[编辑]参阅
(C++20) | 创建等待或销毁无可观察作用的协程句柄 (函数) |