4

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

1 回答 1

6

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

可恢复函数的返回类型必须是 future 或 shared_future 。对 T 的限制由 std::future 定义,而不是本提案,但 T 必须是可复制或可移动类型,或“无效”。也必须可以在没有参数的情况下构造 T 的变量;也就是说,如果它是类类型,它必须有一个可访问的(隐式或显式)默认构造函数。

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

一元运算符的操作数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-returning 函数is_ready()指示一个值是否已被保存,则await可以使实现更有效。

目前,讨论仍在进行中。如果泛化被接受,一个resumable函数将能够返回一个boost::future. 否则,它将被限制为std::futureand std::shared_future

于 2014-03-25T15:14:06.977 回答