C++20 co_yield与生成器实现
请解释co_yield的用法,并用C++20协程实现一个简单的整数生成器。
回答
专业代码师
co_yield用于从协程中产生一个值并挂起,类似Python的yield。其等价于co_await promise.yield_value(expr)。
生成器实现(需自定义promise_type和生成器类型):
template<typename T>
struct Generator {
struct promise_type {
T current_value;
auto yield_value(T v) {
current_value = v;
return std::suspend_always{};
}
auto get_return_object() { return Generator{this}; }
auto initial_suspend() { return std::suspend_always{}; }
auto final_suspend() noexcept { return std::suspend_always{}; }
void return_void() {}
void unhandled_exception() { std::terminate(); }
};
// ... 迭代器支持
};
Generator<int> range(int n) {
for (int i = 0; i < n; ++i)
co_yield i;
}
适用于惰性求值、无限序列等场景。