Я пытаюсь получить код от эта почта для работы с Visual Studio 2013. Моя текущая версия ниже и отлично работает с gcc и clang (колиру демо).
Стандарт говорит о std :: async в 30.6.8.2:
Требуется: F и каждый Ti в Args должен удовлетворять требованиям 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)));
}
}
#endifint 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();
}
Задача ещё не решена.