1

我正在尝试将 packaged_task 包装在一个泛型类中,但无法使用泛型函数对其进行初始化。我已经让它为一个特定的工作,但我希望它更抽象。仅供参考,如果您取消注释我注释掉的 2 行代码,则代码运行良好。我的猜测是,我试图错误地使用模板参数。

编辑:做了一些补充,以便这实际上有效,但同样的问题仍然存在。因此,如果我尝试将一个函数传递给我的类的 ctor,当我尝试调用 ret.get() 时,我会得到一个“错误的函数调用”。但是,如果我直接命名该函数,它就可以工作。

EDIT2.0:为了使这变得非常容易,我在这里只想知道为什么调用 tsk(func) 不起作用,而 tsk(countdown) 起作用?以及如何使 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;
}
4

1 回答 1

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();
    }
};
于 2015-05-02T13:57:49.897 回答