使用延续实现在MSVC上编译错误

时间:2014-07-22 19:53:09

标签: c++ c++11 asynchronous future continuations

我试图从this post获取代码以使用Visual Studio 2013.我当前的版本如下,并且可以正常使用gcc和clang(coliru demo)。

标准说明了30.6.8.2中的std :: async:

  

要求:F和Args中的每个Ti应满足MoveConstructible要求。

但是来自MSVC的标准库似乎试图复制仿函数对象,由于std :: future成员,这显然不起作用。

我目前的解决方法是注释掉的复制构造函数,它可以处理恶意内容,但是参考对象可能是更好的解决方法。

我的代码不正确或VS有错误吗?如果这是一个错误,是否有更好的解决方法?

#ifndef CONTINUATION_H
#define CONTINUATION_H

#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(std::move(const_cast<helper&>(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));
        }
    };

}

namespace util
{
    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)));
    }
}

#endif



int main()
{
    std::promise<int> prom;
    auto fut = prom.get_future();

    std::thread th([&](){
        prom.set_value(42);
    });

    util::then(std::move(fut), [](std::future<int> f){
        printf("future got: %i\n", f.get());
    });

    th.join();
}

0 个答案:

没有答案