1

我尝试编译这个(带有一些明显的小修复) c++11 异步延续或尝试 使用带有 libc++ 的 clang(最新版本)的 .then() 语义,但它不会编译:没有匹配函数调用'然后'。

我找不到原因...你能帮我吗?

4

1 回答 1

2

有几个地方没有答案move。没有移动,future被要求复制,它不能,因为它是一个移动类型。

#include <future>

namespace detail
{

template<typename F, typename W, typename R>
struct helper
{
    F f;
    W w;

    helper(F f, W w)
        : f(std::move(f))
        , w(std::move(w))
    {
    }

    helper(const helper& other)
        : f(other.f)
        , w(other.w)
    {
    }

    helper(helper&& other)
        : f(std::move(other.f))
        , w(std::move(other.w))
    {
    }

    helper& operator=(helper other)
    {
        f = std::move(other.f);
        w = std::move(other.w);
        return *this;
    }

    R operator()()
    {
        f.wait();
        return w(std::move(f)); 
    }
};

}  // detail

template<typename F, typename W>
auto then(F f, W w) -> std::future<decltype(w(std::move(f)))>
{ 
    return std::async(std::launch::async,
      detail::helper<F, W, decltype(w(std::move(f)))>(std::move(f),
                                                      std::move(w))); 
}

int
test()
{
    return 1;
}

int
main()
{
    std::future<int> f = std::async(test);
    auto f2 = then(std::move(f), [](std::future<int> f)
    {
        return f.get() * 2; 
    });
}
于 2013-04-25T15:04:00.273 回答