2015-05-01 2 views
1

Я пытаюсь обернуть 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; 
} 

ответ

1

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

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

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

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

Потому что я намеренно не использую асинхра. Возможно, мне нужно немного изменить заголовок. –

+0

Это не работает. Возвращает меня к тем же ошибкам, которые я получил в первый раз. –

+1

Как вы создаете экземпляр? Работает нормально: 'packaged_task_wrapper task (& countdown);' –

Смежные вопросы