Я хочу использовать System.Threading.Tasks.Task.ContinueWith
.net в C++, поэтому я пишу следующую функцию.
#include <iostream>
#include <functional>
#include <future>
template <typename Func, typename Ret>
auto continue_with(std::future<Ret> &&fu, Func func)
-> std::future<decltype(func(fu.get()))>
{
return std::async(
[fu = std::move(fu), func]() mutable { return func(fu.get()); }
);
}
template <typename Func>
auto continue_with(std::future<void> &&fu, Func func)
-> std::future<decltype(func())>
{
return std::async(
[fu = std::move(fu), func]() mutable { fu.get(); return func(); }
);
}
int main()
{
std::future<void> fu = std::async([]{ std::cout << "fu" << std::endl; });
std::future<void> fu2 = continue_with(
std::move(fu),
[]{ std::cout << "fu2" << std::endl; }
);
fu2.get();
std::cout << "fu continue complete" << std::endl;
std::future<int> retfu = std::async([]{ std::cout << "retfu" << std::endl; return 3; });
std::future<int> retfu2 = continue_with(
std::move(retfu),
[](int result){ std::cout << "retfu2 " << result << std::endl; return result + 1; }
);
int ret = retfu2.get();
std::cout << "retfu continue complete : " << ret << std::endl;
std::cin.get();
}
Этот код работает на gcc 4.8.2 с -std=c++1y
. (не знаю почему, но с -std=c++11
тоже работает)
Но это не работает на VC++ 2013. Я думаю, это из-за init-capture, функции C++14. Как я могу запустить этот код с помощью VC++ 2013?
(Я хочу использовать лямбда, поэтому, пожалуйста, не говорите мне «используйте только структуру объекта-функции!»)
(Я попытался переместить захват в лямбда-выражении, но это не сработало..)
(Буду признателен, если вы не только ответите на мой вопрос, но и улучшите мой код)
std::shared_ptr<std::future>
требуется, и я думаю, что это меня не удовлетворяет.. - person ikh   schedule 15.02.2014auto_ptr
(а именно, перемещает вместо копирования). - person dyp   schedule 15.02.2014shared_ptr
. -- Кроме того, в своем вопросе вы сказали, что пробовали решение из захвата Move в лямбда, но оно не сработало. Что именно не сработало? - person dyp   schedule 16.02.2014std::async
? - person dyp   schedule 16.02.2014