ZBLOG

c++ 协程 auto yield_value(int ret)

在 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_handlestd::experimental::suspend_always ,因为在此之前的标准中,C++ 协程支持还不够完善。需要确保编译器对 C++20 的协程特性有良好的支持。

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


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?