将具有可变参数模板参数的成员函数传递给可变参数构造函数

时间:2016-01-29 22:58:42

标签: c++ multithreading c++11

我无法弄清楚如何将带有可变参数模板参数的成员函数传递给PAPSPH构造函数。我有一个接收函数及其参数的方法,需要将它们传递给在新线程中调用的其他方法,并在那里调用传递函数。 这是简化版:

PAPSPT

以这种方式传递参数有问题,我得到以下错误:' std :: thread :: thread&#39 ;:没有重载函数需要4个参数。我怎么能这样做?

1 个答案:

答案 0 :(得分:5)

这里的问题是,当您将&Test::Operation传递给线程构造函数时,它无法推导出&Test::Operation的模板参数。 (如果你想理解为什么不能做这个推论,你应该问一个单独的问题。)关键是你需要明确指定&Test::Operation的模板参数。

这将是这样的:

template<typename Function, typename... Args>
void Run(Function&& f, Args&&... args)
{
    std::thread t(&Test::Operation<std::decay_t<Function>, std::decay_t<Args>...>,
                  this, std::forward<Function>(f), std::forward<Args>(args)...);
    t.detach();
}

我为你添加了完美的转发:这很重要,因为你不想执行不必要的副本,对吗?

但为什么我们需要decay_t?这是因为线程构造函数在将它们的副本存储在新线程的内部存储中之前衰减其参数,因此,例如,如果传入"Hi!",则推导出的类型为const char (&)[4],但它将成为一旦const char*朽烂,并且衰变是不可逆转的,因此Test::Operation一定不能指望const char (&)[4],这不能从腐朽的const char*初始化。因此必须指定Test::Operation来采用腐朽类型。

您可能还希望在实际调用期间进行完美转发。

链接:http://coliru.stacked-crooked.com/a/c9d04c03a3758b51