条件std :: future和std :: async

时间:2016-04-25 06:06:47

标签: c++ c++11 asynchronous future

我需要做条件行为。

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

// ... Some code

x = f.get();

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

上面的代码是否正常?我可以做那样的事情(将'int'分配给'std :: futture'吗?或者可能有更好的解决方案?

3 个答案:

答案 0 :(得分:3)

std::future没有转化constructor,因此您的代码无效(正如您实际尝试编译代码时会注意到的那样)。

您可以使用默认构建的未来,然后在使用未来之前检查它是否valid

答案 1 :(得分:2)

您可以在不使用这样的线程的情况下将值加载到未来:

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;

答案 2 :(得分:0)

您可以为其他案例(使用不同的政策)返回std::future<int> f = pointer ? std::async(&Class::method, ptr) : std::async(std::launch::deferred, [](){ return 0;});

l