Я пытаюсь обернуть packaged_task в общий класс, но проблема с инициализацией его с помощью общей функции. Я получил его для работы для определенного, но я хочу, чтобы он был более абстрактным. Просто fyi, если вы раскомментируете две строки кода, которые я прокомментировал, код работает нормально. Я предполагаю, что я пытаюсь неправильно использовать параметры шаблона.Идеальная пересылка и packaged_task обертка
EDIT: Сделано несколько дополнений, так что это действительно работает, но та же проблема сохраняется. Поэтому, если я попытаюсь передать функцию в ctor моего класса, я получаю «плохой вызов функции», когда пытаюсь вызвать ret.get(). ОДНАКО, если я называю функцию напрямую, она работает.
EDIT2.0: Чтобы сделать это очень просто, все, что я хочу знать, вот почему вызов tsk (func) не работает, а 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;
}
Потому что я намеренно не использую асинхра. Возможно, мне нужно немного изменить заголовок. –
Это не работает. Возвращает меня к тем же ошибкам, которые я получил в первый раз. –
Как вы создаете экземпляр? Работает нормально: 'packaged_task_wrapper task (& countdown);' –