条件标准::未来和标准::异步

Conditional std::future and std::async

本文关键字:标准 异步 未来 条件      更新时间:2023-10-16

我需要做条件行为。

std::future<int> f = pointer ? std::async(&Class::method, ptr) : 0;
// ... Some code
x = f.get();

所以我想将 x 结果分配给 x ptr->method() 调用的异步结果,如果 ptrnullptr,则为 0

上面的代码可以吗?我可以做这样的事情吗(将"int"分配给"std::futture"?或者也许有更好的解决方案?

std::future没有转换构造函数,因此您的代码无效(如果您实际尝试编译代码,您会注意到这一点)。

您可以做的是使用默认构造的未来,然后在使用未来之前检查它是否有效。

您可以将值加载到将来,而无需使用如下所示的线程:

std::future<int> f;
if ( pointer )
    f = std::async(&Class::method, ptr);
else
{
    std::promise<int> p;
    p.set_value(0);
    f = p.get_future();
}
// ... Some code
x = f.get();

但实现相同目标的更简单方法是:

std::future<int> f;
if ( pointer )
    f = std::async(&Class::method, ptr);
// ... Some code
x = f.valid() ? f.get() : 0;

您也可以为其他情况返回std::future(使用不同的策略):

std::future<int> f = pointer
    ? std::async(&Class::method, ptr)
    : std::async(std::launch::deferred, [](){ return 0;});