延迟异步示例

此代码实现了 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;
}