Идеальная пересылка и упакованный_задачник

Я пытаюсь обернуть packaged_task в универсальный класс, но не могу инициализировать его с помощью универсальной функции. Я заставил это работать для определенной, но я хочу, чтобы это было более абстрактным. Просто к сведению, если вы раскомментируете 2 строки кода, которые я закомментировал, код работает нормально. Я предполагаю, что я пытаюсь использовать параметры шаблона неправильно.

РЕДАКТИРОВАТЬ: сделал некоторые дополнения, чтобы это действительно работало, но та же проблема сохраняется. Поэтому, если я пытаюсь передать функцию в ctor моего класса, я получаю «неправильный вызов функции», когда пытаюсь вызвать ret.get (). ОДНАКО, если я назову функцию напрямую, она работает.

РЕДАКТИРОВАТЬ 2.0: Чтобы сделать это действительно легко, все, что я хочу знать здесь, это почему вызов tsk (func) не работает, а tsk (обратный отсчет) работает? А как заставить работать tsk (func) …

int countdown (int from, int to) {
for (int i=from; i!=to; --i) {
std::cout << i << '\n';
std::this_thread::sleep_for(std::chrono::seconds(1));
}
std::cout << "Lift off!\n";
return from-to;
}

template<typename> class packaged_task_wrapper;

template<typename T, typename... Args>
class packaged_task_wrapper<T(Args...)> {
public:

template<typename ...Ts>
explicit packaged_task_wrapper(Ts &&... ts) : func(forward<Ts>(ts)...) {

packaged_task<T(Args...)> tsk(func);       // THIS DOES NOT WORK
//packaged_task<T(Args...)> tsk(countdown);  // THIS WORKS

future<T> ret = tsk.get_future();          // get future
thread this_thread (move(tsk),3,0);        // spawn thread to count down from 3 to 0
int value = ret.get();                     // wait for the task to finish and get result
// ...

cout << "The countdown lasted for " << value << " seconds.\n";
this_thread.join();
}
};int main ()
{
packaged_task_wrapper<int(int,int)>(countdown);

return 0;
}

1

Решение

Почему бы не использовать std::async? Если все, что вам нужно, это запустить функцию в другом потоке, то это поможет.

auto future_result = std::async(std::launch::async,
[&](){ return countdown(3, 0); });
future_result.get();

Если вы не хотите использовать async, тогда это должно работать:

template<typename> class packaged_task_wrapper;

template<typename T, typename... Args>
class packaged_task_wrapper<T(Args...)> {
public:

template <typename F>
explicit packaged_task_wrapper(F&& f) {

packaged_task<T(Args...)> task(std::forward<F>(f));
future<T> ret = task.get_future();       // get future
thread this_thread (move(task), 10, 8);  // spawn thread to count down from 3 to 0
T value = ret.get();                     // wait for the task to finish and get result
// ...

std::cout << "The countdown lasted for " << value << " seconds.\n";
this_thread.join();
}
};
1

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


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