如何创建task_handle对象作为类的成员?

时间:2014-07-05 09:10:42

标签: c++

在我的软件中,我有一个for循环,它有一个非常繁重的过程,所以我想使用mask_task等并行方法来并行运行这个for循环。 我需要在头文件中创建一个任务处理程序数组,然后在cpp文件中使用它们 make_task的MSDN定义是本地的,返回值为' auto'所以我不能使用MSDN。

这就是我目前成功使用的内容:

auto t1 = make_task([&]ParProcess(Input1,&Output1,&Output2);});

但我需要转换' t1'到类的成员和指针。 愿有人帮帮我吗?

1 个答案:

答案 0 :(得分:0)

MSDNmake_task返回task_handle<Function>,其中Function是您传递的函数类型。

Lambdas具有无法命名的类型,因此您的两个选项是将lambda包装在std::function中:

struct ClassContainingTask {
    ClassContainingTask(int Input1, int *Output1, int *Output2) :
        t1(std::function<void()>([&]{ParProcess(Input1,Output1,Output2);}))
    {}
    task_handle<std::function(void())> t1;
};

或将您的课作为模板,并使task_handle成为模板参数:

template<typename F>
struct ClassContainingTask {
    ClassContainingTask(F &&f) : t1(std::forward<F>(f))
    {}

    task_handle<typename std::decay<F>::type> t1;
};

template<typename F>
ClassContainingTask<F>
make_ClassContainingTask_helper(F &&f) {
    return ClassContainingTask<F>(std::forward<F>(f));
}

//Call this to create the ClassContainingTask instantiated
//with the appropriate template parameter
auto make_ClassContainingTask = [](int Input1, int *Output1, int *Output2) {
    return make_ClassContainingTask_helper([&]{ParProcess(Input1,Output1,Output2);});
};