c++ - 从T创建std::future <T>的最佳方法

标签 c++ c++11 future

我正在使用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吗?

    编辑:示例,缓存:

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

    最佳答案

    Is this a valid way to create a std::future from a T?



    是的。

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

    好吧,这只是个名字... Afaik,您的逻辑很好。

    关于c++ - 从T创建std::future <T>的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59712523/

    相关文章:

    c++ - 如何找到元组 vector 中的最大值?

    c++ - 模板 : How to select smallest int type which holds n bits?

    Python:将子流程模块从 v3.3 导入到 v2.7.4

    Java CompletableFuture.complete() block

    java - 并行运行多个 HystrixCommand 的最佳方式

    c++ - std::cin 是否无法将命令行中的用户输入传递给类型为 char 的变量?

    c++ - HANDLE_MSG 宏给出 'HANDLE_0xXXXX is undefined'

    c++ - 动态内存使用速度较慢的是什么?

    c++ - 标准在 §3.4.1/6 的示例中讨论的是 A::N::f 的最外层 block 作用域

    c++ - 如何使用 std::rand 生成非重复的随机数序列