如何创建已解析的std::future?(C++20环境)
如何在C++20中创建已解析的std::future
在C++20中,std::future没有直接接收值的构造函数,要创建携带就绪结果的std::future,可以通过以下两种方式实现:
方法一:使用std::promise(推荐)
通过std::promise桥接结果与std::future,这是最直接的实现方式:
- 创建
std::promise<int>对象,负责管理结果状态 - 调用
set_value将缓存结果传入,此时对应的future会变为就绪状态 - 通过
get_future()获取绑定好的std::future并返回
修改后的代码示例:
// Class declarations shortened to minimal example to communicate intent class MyClass { Cache m_cache; std::future<int> foo(int arg); }; class Cache { public: std::optional<int> get(int arg); }; std::future<int> MyClass::foo(int arg) { if (auto res = m_cache.get(arg)) { std::promise<int> p; p.set_value(*res); return p.get_future(); } // 缓存未命中时执行计算逻辑 return std::async(std::launch::async, [arg]() { // 此处替换为实际计算逻辑 return arg * 2; }); }
方法二:使用std::async的deferred策略
利用延迟执行特性,创建一个立即返回结果的future:
if (auto res = m_cache.get(arg)) { return std::async(std::launch::deferred, [val = *res]() { return val; }); }
这种方式的底层会多一层lambda调用开销,适合简单场景,而std::promise是更高效直接的方案。
内容的提问来源于stack exchange,提问作者Carson
相关产品推荐
相关产品推荐

