Вы можете иметь такой асинхронный API
std::future<int> GetAsync()
Есть случаи, когда, например, вы уже кэшировали результат и хотели бы вернуть будущее, инициализированное с результатом. Есть ли способ с текущим стандартом (или предложением), чтобы достичь этого без повторения создания дополнительного std :: обещания или создания дополнительной асинхронности (с отложенной политикой запуска)?
РЕДАКТИРОВАТЬ
Рассмотрим также случай, когда результат вычисляется на основе некоторого состояния, локального для функции GetAsync (), и необходимости фиксировать это, вероятно, по значению в случае, если кто-либо решит использовать std :: async с отложенной политикой запуска
Я явно что-то неправильно понимаю, почему вы не можете просто сделать это:
std::future<int> GetAsync()
{
if (/*already got result*/)
{
std::promise<int> p;
p.set_value(/*result*/);
return p.get_future();
}
return std::async(/*whatever is needed*/);
}
Что плохого в создании обещания? Если вы хотите получить результат из будущего (асинхронный возвращаемый объект), вам нужен асинхронный поставщик, promise
такой тип.
Фьючерсы и обещания заключаются в том, что они предназначены для многопоточного использования. Поэтому, если вы хотите вернуть объект будущего, вам нужно создать его либо через std::async
позвонить, std::packaged_task<>
или std::promise<>
, Если это так, то ответ @ ronag — хит.
Если это не общий случай, и вы просто хотите вернуть косвенное значение к вашему значению, вы можете использовать std::function
для прямого вычисления или механизм кеширования вокруг него, или Expected<T>
значение для обработки ошибок тоже, что и для фьючерсов; Таким образом, вы не будете платить за связь потоков.