gpt4 book ai didi

C++ 查找 co_await 等待结果类型

转载 作者:行者123 更新时间:2023-12-01 12:47:45 24 4
gpt4 key购买 nike

我想知道是否可以找到可等待的 co_await 的结果类型:
由于无法在未评估的上下文中使用 co_await,我不能这样做

template<class Awaitable>
task<> f(Awaitable&& awaitable)
{
using result_type = decltype(co_await awaitable);
}

有什么办法可以做到吗?

这里的主要目的是确定result_type是否为void,这里基本上是我们所拥有的:我们想要fire_and_forget一个任务,并在完成时调用一个方法,但由于void返回类型,这并不容易
template<class Awaitable, class Success, class Failure >
detail::fire_and_forget_task call_async_then(Awaitable awaitable, Success success, Failure failure)
{
try
{
using result_type = ??
if constexpr (std::is_same_v<void, result_t>)
{
co_await awaitable;
success();
}
else
success(co_await f);
}
catch(...)
{
failure(std::current_exception());
}
}

也许有一个更简单的方法来做到这一点,但现在我没有想到任何方法。

谢谢

最佳答案

一般没有办法做到这一点,因为co_awaitcoroutine machinery部分取决于调用 co_await 的函数的 promise 类型.当co_await <expr>被调用,它必须转换 <expr>变成可等待的类型。该过程的一部分涉及询问协程的 promise 类型,如果它愿意的话,可以权衡这个转换。由于promise类型是由协程的签名定义的,任何co_await <expr>的结果类型因此取决于调用它的函数的签名。

这就是为什么co_await不能在未评估的上下文中使用;它的行为取决于上下文。

现在,如果你知道你的 promise 类型没有 await_transform (您可能确实知道,因为它是您的 promise 类型),然后可以计算结果类型。 co_await <expr> 的等待类型将只是 <expr> 的类型.然后通过调用 operator co_await 将其转换为 awaiter 对象。在表达式上。这有点难以计算,因为它可以通过成员函数或非成员运算符调用来调用,因此这是元编程的一个棘手问题。

一旦你有了 awaiter 对象类型,你就可以得到它的返回类型 await_resume() ;这是co_await <expr>的类型表达。

关于C++ 查找 co_await 等待结果类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61274146/

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