В 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
это) конструктор по умолчанию, если он имеет тип класса.
Тем не менее, раздел 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
,
Других решений пока нет …