传递模板函数,线程参数

时间:2014-11-10 19:31:05

标签: c++ multithreading templates

我有一个模板功能。需要一个论点。从该函数中我想在一个新函数上调用thread()。

我想传递一个模板函数,并传递传递给第一个参数的参数。

传递给两个函数的值的类型总是相同的,甚至不会改变。

代码:

template<typename T, typename R, typename S>
void execute_no_atomic(function<R(vector<T>&, vector<S>&)>& fn, vector<T>& input, vector<S>& output);

template<typename T, typename R, typename S>
void Threadpool::execute_no_atomic(function<R(vector<T>&, vector<S>&)>& fn, vector<T>& input, vector<S>& output)
{
    // wrap the function we passed in into a thread, have each thread use the code below
    size_t i;
    for (i = 0; i < thread_count; ++i) {}
    threads[i] = thread(exec, fn, input, output);   

}

template<typename T, typename R, typename S>
void exec(function<R(vector<T>&, vector<S>&)>& fn, vector<T>& input, vector<S>& output);

2 个答案:

答案 0 :(得分:1)

如果没有指定特定的专业化,则无法引用功能模板。这是因为需要知道模板参数才能确定函数类型。你可以提供一个简单地转发参数的包装类,而不是直接传递函数,换句话说就是一个函子:

struct exec_wrapper
{
    template <class... Args>
    auto operator()(Args&&... args) -> decltype(exec(std::forward<Args>(args)...))
    {
        return exec(std::forward<Args>(args)...);
    }
};

...
threads[i] = thread(exec_wrapper{}, fn, input, output);

C ++ 14为我们提供了通用的lambda,它更紧凑,所以你可以这样使用它:

auto glambda = [&] (auto&&... args)
{ return exec(std::forward<decltype(args)>(args)...); };

threads[i] = thread(glambda, fn, input, output); 

答案 1 :(得分:0)

好吧,实际上我真正需要的是一个模板 class ,这样我的所有模板类型都可以在不同的函数中共享。

这完全解决了这个问题。