我有一个模板功能。需要一个论点。从该函数中我想在一个新函数上调用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);
答案 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 ,这样我的所有模板类型都可以在不同的函数中共享。
这完全解决了这个问题。