C ++ 17 resumable / await:它还能和boost :: future一起使用吗?

时间:2014-03-24 11:33:54

标签: c++ boost c++17

在C ++ 17中,有一个很好的未来,比如C#' await

std::future<int> get_answer()
{
    return std::async(std::launch::async, [] { return 42; });
}
std::future<void> do_something() resumable
{
    // ...
    int a = await get_answer();
    // ...
}

但我想知道boost::future是否也可以使用:

boost::future<int> get_answer()
{
    return boost::async(boost::launch::async, [] { return 42; });
}
boost::future<void> do_something() resumable
{
    // ...
    int a = await get_answer();
    // ...
}

1 个答案:

答案 0 :(得分:6)

您关联的论文(N3722)明确表示只接受std::future<T>std::shared_future<T>作为resumable函数的返回类型:

  

可恢复功能的返回类型必须是future或shared_future   。对T的限制是   由std :: future定义,而不是此提议,但T必须是可复制或可移动的类型,或'void。'它也必须是   可以在没有参数的情况下构造T的变量;也就是说,它必须具有可访问性(隐式或   explic   it)默认构造函数,如果它是类类型。

但是,提案的第4部分(Generalization)建议解除对返回类型的限制。返回的类型应该是具有以下限制的任何类型:

  

一元运算符await的操作数可以是任何类型S<<T>>(“S最终持有T”),满足以下条件:

     
      
  1. S有一个无参数函数get,它最终会产生类型为T的值,或抛出异常。
  2.   
  3. S有一个函数then接受一个参数S<<T>>S<<T>>&const S<<T>>的单参数函数对象。传递到then后,参数保存的值必须立即可通过调用get进行检索。
  4.   
  5. 或者,如果S<<T>>有一个bool - 返回函数is_ready(),表明某个值是否已被保留,则可以提高await的实施效率。
  6.   

目前,讨论仍在进行中。接受泛化,resumable函数将能够返回boost::future。否则,它将仅限于std::futurestd::shared_future