有条件的std :: future和std :: async

问题描述:

我需要做条件行为。有条件的std :: future和std :: async

std::future<int> f = pointer ? std::async(&Class::method, ptr) : 0; 

// ... Some code 

x = f.get(); 

所以我想分配给ptr->method()来电或0 x结果异步的结果,如果ptrnullptr

上面的代码是否正常?我可以做任何这样的事情吗(分配'int'到'std :: futture'?或者也许有更好的解决方案吗?

std::future没有转换constructor所以你的代码是无效的(你会注意到,如果你真实目的是试图编译代码)。

你可以做的是使用默认构造的未来,然后检查它是否valid使用未来之前。

您可以加载一个值到未来,而无需使用像这样的线程:

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;});