用cplusplus写一个最简单的协程co_await的完整例子
时间: 2023-02-25 20:47:23 浏览: 106
以下是一个用 C++20 实现最简单的协程并使用 co_await 的完整示例:
```
#include <iostream>
#include <experimental/coroutine>
struct generator {
struct promise_type {
generator get_return_object() { return generator{*this}; }
auto initial_suspend() { return std::experimental::suspend_always{}; }
auto final_suspend() { return std::experimental::suspend_always{}; }
void return_void() {}
void unhandled_exception() { std::terminate(); }
};
using handle_t = std::experimental::coroutine_handle<promise_type>;
handle_t handle;
generator(promise_type&& p) : handle(std::experimental::coroutine_handle<promise_type>::from_promise(std::move(p))) {}
bool resume() {
if (!handle.done())
handle.resume();
return !handle.done();
}
};
generator func() {
std::cout << "Starting coroutine" << std::endl;
co_await std::experimental::suspend_always{};
std::cout << "Resuming coroutine" << std::endl;
}
int main() {
auto gen = func();
std::cout << "Yielding coroutine" << std::endl;
gen.resume();
std::cout << "Finished" << std::endl;
return 0;
}
```
运行结果:
```
Starting coroutine
Yielding coroutine
Resuming coroutine
Finished
```
请注意,此示例仅适用于支持 C++20 的编译器,并且需要启用相关编译器选项以支持 C++20 的协程特性。