Искам да използвам .net System.Threading.Tasks.Task.ContinueWith
в 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?
(Искам да използвам ламбда, така че, моля, не ми казвайте „използвайте само структура функция-обект!“)
(Опитах Преместване на заснемане в lambda, но не работи..)
(Ще съм благодарен, ако не само отговорите на въпроса ми, но и подобрите кода ми)
std::shared_ptr<std::future>
е задължително и мисля, че не ме удовлетворява.. - person ikh   schedule 15.02.2014auto_ptr
(а именно преместване вместо копиране). - person dyp   schedule 15.02.2014shared_ptr
. -- също така казахте във въпроса си, че сте опитали решението от Move capture в lambda, но не работи. Какво точно не проработи? - person dyp   schedule 16.02.2014std::async
? - person dyp   schedule 16.02.2014