'std :: thread'如何确定传递给构造函数的可变参数的数量

问题描述

调用std::thread的构造函数时,您传递了一个函数及其所需的参数。 std::thread如何确定要传递给函数的参数总数?

#include <iostream>
#include <thread>

void task(int i,char c,bool b)
{
    return;
}

int main(int argc,char** argv)
{
    std::thread t(task,10,'c',true); // these 3 arguments
    t.join();
}

解决方法

std::thread constructor使用variadic template实现:

template< class Function,class... Args >
explicit thread( Function&& f,Args&&... args );

位置:

  • Function是线程将调用的可调用对象的类型(无论是函数,lambda,函子等)。
  • Argsargs可变参数中的类型列表。
  • f是线程将调用的实际可调用对象。
  • args是将传递给f的值的列表。
然后

std::thread可以使用参数包扩展args转发到f,将{em>相似转发到f(args...); 。编译器本身而非std::thread会将args...扩展为实际值,即:f(arg1,arg2,...,argN)

因此,std::thread t(task,10,'c',true);将创建一个工作线程,该线程与f(args...)进行调用,它们被扩展为task(10,true)

>

因此,您传递给std::thread构造函数的参数必须与您传递的f可调用参数相匹配,否则代码将无法编译。

,

std::thread's constructor的格式为

template< class Function,Args&&... args );

如您所见,第一个参数是要运行的函数,其余的是要传递给它的参数。如果不匹配,则会出现某种编译器错误