在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();
// ...
}
答案 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”),满足以下条件:
- S有一个无参数函数
get
,它最终会产生类型为T的值,或抛出异常。- S有一个函数
then
接受一个参数S<<T>>
,S<<T>>&
或const S<<T>>
的单参数函数对象。传递到then
后,参数保存的值必须立即可通过调用get
进行检索。- 或者,如果
醇>S<<T>>
有一个bool
- 返回函数is_ready()
,表明某个值是否已被保留,则可以提高await
的实施效率。
目前,讨论仍在进行中。接受泛化,resumable
函数将能够返回boost::future
。否则,它将仅限于std::future
和std::shared_future
。