首页 > 解决方案 > 创建 std::future 的最佳方法从一个 T

问题描述

我正在使用 astd::future<T>来存储可选异步操作的结果。根据函数的参数,操作是异步的或同步的。在同步情况下,我有一个想要存储在future. 我怎样才能最好地做到这一点?

https://en.cppreference.com/w/cpp/thread/future中给出的示例是:

  1. future从一个packaged_task
  2. future从一个async()
  3. future从一个promise

但是没有 a 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>从 a创建 a 的有效方法T吗?

有没有更好的方法std::future<T>从 a 创建 a T

编辑:示例,缓存:

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);
}

标签: c++c++11future

解决方案


这是从 T 创建 std::future 的有效方法吗?

是的。

但是,我会说“make_future”可能不是最合适的名称。'future' 类的整个想法是它的值可能在未来准备好,而你的函数总是返回一个已经实现的未来。

好吧,这只是一个名字...... Afaik,你的逻辑非常好。

编辑:有一个关于make_ready_futuremake_exceptional_future函数的 C++ 提案。 P0159R0


推荐阅读