Я использую std::future<T>
для хранения результата необязательной асинхронной операции. В зависимости от аргументов функции операция может быть асинхронной или синхронной. В синхронном случае у меня есть значение, которое я хочу сохранить в future
. Как мне лучше всего это сделать?
Примеры, приведенные в https://en.cppreference.com/w/cpp/thread/future:
future
от packaged_task
future
из async()
future
из promise
Но нет make_future
, и конструктор future
не позволяет создавать выполняется future
из значения. Поэтому я создал вспомогательную функцию для этого, пройдя через promise
следующим образом:
template <typename T>
std::future<T> make_future(T&& t)
{
std::promise<T> p;
p.set_value(std::forward<T>(t));
return p.get_future();
}
Это правильный способ создания std::future<T>
из T
?
Есть ли лучший способ создать std::future<T>
из T
?
EDIT: пример, кэш:
Foo readAndCacheFoo(int id);
std::future<Foo> readFooAsync(int id)
{
{
const lock_guard lock{cacheMutex};
if (id == cachedId)
{
return make_future(cachedFoo);
}
}
return std::async(readAndCacheFoo, id);
}