c++ 17 resume /await:它也可以与boost::future一起使用吗?

C++17 resumable/await : Can it also be used with boost::future?

本文关键字:一起 future boost 也可以 resume await c++      更新时间:2023-10-16

在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();
    // ...
}

您链接的论文(N3722)明确指出,只有std::future<T>std::shared_future<T>被接受为resumable函数的返回类型:

可恢复函数的返回类型必须是future或shared_future。对T的限制是由std::future定义,而不是这个建议,但T必须是可复制或可移动的类型,否则为' void '。"一定也是可以构造一个没有参数的T的变量;也就是说,它必须具有可访问的(隐式的)或explic如果它是类类型,则为默认构造函数。

然而,提案(Generalization)的第4节建议取消返回类型限制。返回类型应该是具有以下限制的任何类型:

一元操作符await的操作数可以是任意类型S<<T>> (" S最终持有一个T "),并且满足以下条件:

  1. S有一个无参数函数get,它要么最终产生T类型的值,要么抛出异常。
  2. S有一个函数then,它接受一个参数为S<<T>>S<<T>>&const S<<T>>的单参数函数对象。一旦传递给then,参数所持有的值必须立即可用于调用get来检索。
  3. 可选的,如果S<<T>>有一个bool -返回函数is_ready()指示一个值是否已经被持有,await的实现可以更有效。

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