【发布时间】:2021-07-16 13:30:47
【问题描述】:
在下面的代码中,我试图从协程 std :: vector 返回。问题是协程只返回std::vector<int> get_return_object()的结果。
当 co_return 语句执行时,方法void return_value(std::vector<int>&& value)被调用,它填充方法get_return_object()返回的向量。但是来自get_return_object() 的向量是按值返回的,它不起作用。当我尝试这样做时
std::vector<int> return_value(std::vector<int>&& value){
return value
}
协程也会返回一个空向量,尽管 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;
}
【问题讨论】:
-
嗯,第一个问题是您对协程特征的专业化不依赖于任何用户提供的类型,因此您的程序格式不正确。将 this 的隐式参数添加到它。 ;)
-
二、替换“但是get_return_object()中的向量是按值返回的,不起作用。” “它不起作用”,并完整描述了发生的情况,以及与您想要的不符的原因。 “它不起作用”是不够的。
-
“问题是协程只返回了std::vector
get_return_object()的结果。”等等,什么?这是怎么回事? -
@Yakk-AdamNevraumont,问题是get_return_object()返回的值不能被return_value函数重新填充,因为它是按值返回的。而且我不知道如何不通过get_return_object从协程返回结果。
-
帮自己一个忙,用写的东西。目前大约有 3-4 个成熟的库可供选择。
标签: c++ asynchronous c++20 coroutine