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 | - | 生成器的值类型(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) for (const T& x : left->traverse_inorder()) co_yield x; co_yield value; if (right) for (const T& x : right->traverse_inorder()) co_yield x; } }; 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) |
创建在等待或销毁时无可观察作用的协程柄 (函数) |