C ++ 17 возобновляем / ожидаем: может ли он также использоваться с boost :: future?

В 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

Решение

Документ, который вы связали (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») соответствует следующим условиям:

  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::future а также std::shared_future,

6

Другие решения

Других решений пока нет …