c++ - 创建 std::future 的最佳方法从一个 T
问题描述
我正在使用 astd::future<T>
来存储可选异步操作的结果。根据函数的参数,操作是异步的或同步的。在同步情况下,我有一个想要存储在future
. 我怎样才能最好地做到这一点?
https://en.cppreference.com/w/cpp/thread/future中给出的示例是:
future
从一个packaged_task
future
从一个async()
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);
}
解决方案
这是从 T 创建 std::future 的有效方法吗?
是的。
但是,我会说“make_future”可能不是最合适的名称。'future' 类的整个想法是它的值可能在未来准备好,而你的函数总是返回一个已经实现的未来。
好吧,这只是一个名字...... Afaik,你的逻辑非常好。
编辑:有一个关于make_ready_future
和make_exceptional_future
函数的 C++ 提案。
P0159R0
推荐阅读
- google-maps - 没有西撒哈拉的谷歌地图标准摩洛哥视图
- javascript - Knex Heroku 错误:自签名证书
- javascript - 为什么我的 javascript 会自动设置我分配的布尔值?
- regex - 命令行 bash 如何从网页的 curl 输出中提取 json 文本
- android - 如何使用 android 运行时依赖项创建和运行 jar/dex 文件
- github - 是否可以将旧存储库中的更改合并到重复的存储库?
- css - 如何动画背景过滤器?
- vue.js - vuejs路由器链接和eslint规则
- css - 当 `stylelint-scss` 告诉我使用 `list.nth` 时,为什么 SCSS 会抱怨?
- mongodb - 使用 ObjectID 作为外部字段的本机 MongoDB 查询连接 2 个表