
在 C++20 中,协程(Coroutines)支持异步生成器模式,核心是通过 co_yield 暂停执行并产出值,配合自定义的协程返回类型(如 generator<t></t>)实现懒求值、按需生成的迭代器行为。它不是“异步 I/O”意义上的 async/await(那需要 executor 和 awaitable),而是“异步生成”——即调用方可以一边取值、一边让生成逻辑在后台(或分步)计算,不阻塞主线程。
1. 用 std::generator(C++26 草案)或手动实现 generator<t></t>
C++20 标准库并未提供 generator,但 MSVC 和 libc++ 已实验性支持 std::generator(C++26 提案 P2471)。若用 GCC 或需跨平台兼容,推荐手动实现一个轻量 generator<t></t>,重点在于:
- 定义协程返回类型(含
promise_type) -
promise_type::get_return_object()返回 generator 实例 -
promise_type::yield_value(T&& v)保存当前值并挂起 -
generator自带迭代器接口(begin()/end()),内部用coroutine_handle控制恢复
2. 基础同步生成器:斐波那契数列示例
这是理解 co_yield 最直观的例子——每次调用 ++it 触发一次恢复,产出下一个数:
generator<int> fib(int n) {
int a = 0, b = 1;
co_yield a;
if (n <= 1) co_return;
co_yield b;
for (int i = 2; i < n; ++i) {
int next = a + b;
co_yield next;
a = b;
b = next;
}
}
// 使用:
for (int x : fib(10)) {
std::cout << x << " "; // 0 1 1 2 3 5 8 13 21 34
}登录后复制
注意:co_yield 自动调用 promise_type::yield_value 并 suspend;co_return 结束协程。整个过程是同步的(无线程/await),但“按需生成”特性已具备。
立即学习“C++免费学习笔记(深入)”;
还木有评论哦,快来抢沙发吧~