您可以拥有像这样的异步API
std::future<int> GetAsync()
有些情况下,例如您已经缓存了结果,并希望返回使用结果初始化的未来。是否有一种方法可以使用当前标准(或提议)来实现这一目标,而无需重复创建额外的std :: promise或进行额外的异步(启动策略延迟)?
修改
还要考虑基于GetAsync()函数本地的某些状态计算结果的情况,以及如果选择在启动策略延迟时选择使用std :: async,则需要捕获可能的值
答案 0 :(得分:10)
我显然误解了一些事情,为什么你不能这样做:
std::future<int> GetAsync()
{
if (/*already got result*/)
{
std::promise<int> p;
p.set_value(/*result*/);
return p.get_future();
}
return std::async(/*whatever is needed*/);
}
创建承诺有什么问题?如果你想从未来(异步返回对象)获得结果,你需要一个异步提供者,promise
就是这样一种类型。
答案 1 :(得分:0)
有期货和承诺的东西是它们是为多线程使用而设计的。因此,如果您想要返回未来的对象,则需要通过std::async
来电,std::packaged_task<>
或std::promise<>
来创建。如果是这样的话,那么@ ronag的答案就会受到影响。
如果这不是一般情况,并且您只想将间接返回到您的值,则可以使用std::function
进行直接计算,或围绕它caching mechanism或Expected<T>
处理错误的价值也像期货一样;所以你不会支付线程通信费用。