延迟异步示例
此代码实现了 std::async
的一个版本,但它的行为就像 async
总是使用 deferred
启动策略调用一样。这个功能也没有 async
的特殊 future
行为; 返回的 future
可以在没有获得其价值的情况下被销毁。
template<typename F>
auto async_deferred(F&& func) -> std::future<decltype(func())>
{
using result_type = decltype(func());
auto promise = std::promise<result_type>();
auto future = promise.get_future();
std::thread(std::bind([=](std::promise<result_type>& promise)
{
try
{
promise.set_value(func());
// Note: Will not work with std::promise<void>. Needs some meta-template programming which is out of scope for this example.
}
catch(...)
{
promise.set_exception(std::current_exception());
}
}, std::move(promise))).detach();
return future;
}