gpt4 book ai didi

c++ - 如何使用 co_return 从协程返回值?

转载 作者:行者123 更新时间:2023-12-04 07:45:35 25 4
gpt4 key购买 nike

在下面的代码中,我试图从协程 std::vector 返回。问题是只有std::vector<int> get_return_object()的结果从协程返回。
当执行 co_return 语句时,方法 void return_value(std::vector<int>&& value)被调用,它填充方法 get_return_object() 返回的 vector .但是来自 get_return_object() 的 vector 按值返回,它不起作用。当我尝试这样做时

std::vector<int> return_value(std::vector<int>&& value){
return value
}
协程也会返回一个空 vector ,尽管 value 不为空。
如何从协程返回值而不将其包装在包含 promise_object 的任务中?
例子:
#include "coroutine"
#include "iostream"
struct Promise {
std::vector<int> vec;
std::vector<int> get_return_object() {
return vec;
}

std::suspend_never initial_suspend() {
return {};
}

std::suspend_never final_suspend() {
return {};
}

void return_void() {}

void return_value(std::vector<int>&& value){
vec = std::move(value);
}

void unhandled_exception() { std::terminate(); }
};

template<typename... Args>
struct std::coroutine_traits<std::vector<int>, Args...>{
using promise_type = Promise;
};

class Caller{
public:
std::vector<int> call();
};

std::vector<int> Caller::call() {
co_return std::vector<int>{1, 2, 3, 4};
}

int main(){
Caller c;
auto vec = c.call();
std::cout << vec.size();
return 0;
}

最佳答案

std::vector<int>不是可等待类型,因此它不能作为协程的返回对象有用。
如果您 add some tracing ,可以看到操作顺序出错了。get_return_object需要返回一些可以得到 std::vector<int> 的东西之后。例如。如果Promise的所有用户从不暂停:

struct Promise {
struct result {
std::future<std::vector<int>> fut;
operator std::vector<int>() { return fut.get(); }
};

std::promise<std::vector<int>> prom;

result get_return_object() {
std::cout << "get_return_object" << std::endl;

return { prom.get_future() };
}

std::suspend_never initial_suspend() {
std::cout << "initial_suspend" << std::endl;
return {};
}

std::suspend_never final_suspend() {
std::cout << "final_suspend" << std::endl;
return {};
}

void return_void() {}

void return_value(std::vector<int>&& value){
std::cout << "return_value" << std::endl;
prom.set_value(std::move(value));
}

void unhandled_exception() { std::terminate(); }
};

关于c++ - 如何使用 co_return 从协程返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67211341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com