ZBLOG

c++ 协程 auto yield_value(int ret)

在 C++ 中,使用协程可以通过使用关键字 co_yield 来实现。在一个协程函数中,你可以使用 co_yield 来产生一个值。下面是一个示例代码:

  1. #include <iostream>
  2. #include <experimental/coroutine>
  3. std::experimental::coroutine_handle<> coroutineHandle;
  4. struct Generator {
  5. struct promise_type {
  6. int value;
  7. auto get_return_object() { return Generator{std::experimental::coroutine_handle<promise_type>::from_promise(*this)}; }
  8. auto initial_suspend() { return std::experimental::suspend_always{}; }
  9. auto final_suspend() noexcept { return std::experimental::suspend_always{}; }
  10. void unhandled_exception() {}
  11. void return_void() {}
  12. };
  13. std::experimental::coroutine_handle<promise_type> handle;
  14. explicit Generator(std::experimental::coroutine_handle<promise_type> h) : handle(h) {}
  15. ~Generator() { if (handle) handle.destroy(); }
  16. bool move_next(int ret) {
  17. promise().value = ret;
  18. handle.resume();
  19. if (handle.done()) {
  20. handle.promise().value = 0;
  21. return false;
  22. }
  23. return true;
  24. }
  25. promise_type& promise() const { return handle.promise(); }
  26. };
  27. Generator yield_value(int ret) {
  28. auto result = co_await std::experimental::suspend_always{};
  29. if (!result) {
  30. co_return;
  31. }
  32. co_return ret;
  33. }
  34. int main() {
  35. coroutineHandle = yield_value(42).handle;
  36. while (coroutineHandle && coroutineHandle.promise().move_next(0)) {
  37. int value = coroutineHandle.promise().value;
  38. std::cout << "Yielded value: " << value << std::endl;
  39. }
  40. coroutineHandle.destroy();
  41. return 0;
  42. }

在这个示例中,我们定义了一个 Generator 类来封装协程句柄和 promise 对象。yield_value 函数用于产生值,并将其返回给调用者。在 main 函数中,我们创建了一个协程实例并通过循环不断获取 yield 的值,并打印出来。

请注意,上述代码使用的是 C++20 中的 std::experimental::coroutine_handlestd::experimental::suspend_always ,因为在此之前的标准中,C++ 协程支持还不够完善。需要确保编译器对 C++20 的协程特性有良好的支持。

希望对你有所帮助!如果你还有其他问题,请随时提问。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:http://sdn.0voice.com/?id=4020

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?