我试图从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();
}