如何解决C++20协程:为什么promise类型与协程对象分离?
典型的协程对象如下所示:
e := {
firstName: array[0],lastName: array[1],role: array[2],}
为什么 struct Coroutine
{
struct promise_type
{
int value;
Coroutine get_return_object() {return this; }
std::suspend_never initial_suspend() { return {}; }
std::suspend_never final_suspend() noexcept { return {}; }
void return_value(int v) {
value = v;
}
void unhandled_exception() {};
};
Coroutine(promise_type *p) : handle(std::coroutine_handle<promise_type>::from_promise(*p)) {
};
~Coroutine() {
handle.destroy();
}
std::coroutine_handle<promise_type> handle;
};
和协程分开了。一个承诺有多个协程,或者一个协程有多个承诺有意义吗?有这样的用例吗?
否则,如果每个协程只能存在一个 promise,那么将返回值嵌入到 promise_type
结构中是否就足够了,例如? :
Coroutine
解决方法
出于多种原因,协程的返回值不同于承诺类型。
-
函数是协程旨在成为函数的实现细节。函数声明中没有任何内容要求它是协程。包括返回类型。这意味着返回协程未来类型的函数可能是也可能不是协程。这允许诸如通过您传递协程之类的事情;你调用了一些自己安排恢复的函数,你只是按原样返回它的返回值。
-
将两者分开是为了允许支持延续的现有类型在内部重新实现为协同程序。或者更一般地说,允许一个类型表示任何类型的异步过程,而不用关心它是否是一个协程。例如,如果
std::future<T>
允许.then
延续,您可以通过让co_await
机器使用co_await
来安排协程的恢复。但您也可以直接使用常规函数调用.then
。如果返回值对象是协程,则不可能(没有某种形式的动态多态性)在不对接口进行外部更改的情况下在内部进行这样的更改。
此外,您似乎将一个恰好是协程的函数的返回值误认为是协程本身。不是这种情况。协程是由协程机制分配的实际调用堆栈,其中包括 promise 对象。返回值链接到协程,但它不是协程本身。协程及其 promise 对象(通常)在堆上分配并存储在其他地方,返回值仅引用它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。