многопоточность — c ++: сборка асинхронная с помощью packaged_task

Я пытаюсь реализовать асинхронную с помощью packaged_task. Я пытаюсь это с помощью шаблонной функции, bsync. bsync принимает 2 аргумента: функцию f и пакет параметров args и возвращает будущее, fut. Будущее имеет тип, возвращаемый f (args …). Т.е. возвращение — это будущее

Я думаю, что я почти там, но я получаю ошибку преобразования типов. Любая помощь будет оценена:

#include "stdafx.h"#include <iostream>
#include <future>
#include <thread>
#include <functional>
#include <type_traits>
using namespace std;//Implement bsync as a templated function
//Template parameters are (i) Fn (the function to run), (ii) Args, a parameter pack of arguments to feed the function
//The function returns a future<Ret>, where Ret is the return-type of Fn(Args)
template<class Fn,class...Args>
auto bsync(Fn f, Args&&...args)->future<result_of<decltype(f)&(Args&&...)>>{

//Determine return-type
typedef result_of<decltype(f)&(Args&&...)>::type A;

//Initialize a packaged_task
packaged_task <A(Args&&...)>tsk(f);

//Initialize a future
future<A> fut = tsk.get_future();

//Run the packaged task in a separate thread
thread th(move(tsk),(args)...);

//Join the thread
th.join();

return fut;
}

int plus_one(int x){
cout << "Adding 1 to " << x << endl;
return x++;
}

int main(){
auto x = bsync(plus_one, 1);

cout << "Press any key to continue:" << endl;
cin.ignore();
return 0;
}

2

Решение

Ваш конечный тип возврата неверен. У тебя есть:

future<result_of<decltype(f)&(Args&&...)>>

Это future с типом result_of<...>, Вам нужно на самом деле оценивать result_of метафункция для создания фактического типа результата. То есть:

future<typename result_of<Fn(Args&&...)>::type>
^^^^^^^^^                        ^^^^^^

Как только вы это исправите, вам не хватает typename в вашем typedef за A,

3

Другие решения


По вопросам рекламы [email protected]