在 C++ 中,使用协程可以通过使用关键字 co_yield
来实现。在一个协程函数中,你可以使用 co_yield
来产生一个值。下面是一个示例代码:
#include <iostream>
#include <experimental/coroutine>
std::experimental::coroutine_handle<> coroutineHandle;
struct Generator {
struct promise_type {
int value;
auto get_return_object() { return Generator{std::experimental::coroutine_handle<promise_type>::from_promise(*this)}; }
auto initial_suspend() { return std::experimental::suspend_always{}; }
auto final_suspend() noexcept { return std::experimental::suspend_always{}; }
void unhandled_exception() {}
void return_void() {}
};
std::experimental::coroutine_handle<promise_type> handle;
explicit Generator(std::experimental::coroutine_handle<promise_type> h) : handle(h) {}
~Generator() { if (handle) handle.destroy(); }
bool move_next(int ret) {
promise().value = ret;
handle.resume();
if (handle.done()) {
handle.promise().value = 0;
return false;
}
return true;
}
promise_type& promise() const { return handle.promise(); }
};
Generator yield_value(int ret) {
auto result = co_await std::experimental::suspend_always{};
if (!result) {
co_return;
}
co_return ret;
}
int main() {
coroutineHandle = yield_value(42).handle;
while (coroutineHandle && coroutineHandle.promise().move_next(0)) {
int value = coroutineHandle.promise().value;
std::cout << "Yielded value: " << value << std::endl;
}
coroutineHandle.destroy();
return 0;
}
在这个示例中,我们定义了一个 Generator
类来封装协程句柄和 promise 对象。yield_value
函数用于产生值,并将其返回给调用者。在 main
函数中,我们创建了一个协程实例并通过循环不断获取 yield 的值,并打印出来。
请注意,上述代码使用的是 C++20 中的 std::experimental::coroutine_handle
和 std::experimental::suspend_always
,因为在此之前的标准中,C++ 协程支持还不够完善。需要确保编译器对 C++20 的协程特性有良好的支持。
希望对你有所帮助!如果你还有其他问题,请随时提问。
内容由零声教学AI助手提供,问题来源于学员提问