std::thread 中的参数。如何运作?
Posted
技术标签:
【中文标题】std::thread 中的参数。如何运作?【英文标题】:Arguments in std::thread. How works? 【发布时间】:2015-02-25 23:37:00 【问题描述】:std::thread构造函数使用示例:
#include <thread>
using namespace std;
void a_function()
void a_function2(int a)
void a_function3(int a,int b)
void a_function4(int &a)
class a_class
public:
void a_function5(int a)
;
int main()
a_class aux;
int a = 2;
thread t(a_function);
thread t2(a_function2,2);
thread t3(a_function3,2,3);
thread t4(a_function4,ref(a));
thread t5(&a_class::a_function5,&aux,2);
t.join();
t2.join();
t3.join();
t4.join();
t5.join();
构造函数如何知道参数的数量?构造函数如何调用一种未知类型的函数?我怎么能实现这样的东西?例如,std::thread 的一个包装器
class wrapper_thread
thread t;
public:
wrapper_thread() //what arguments here?
: t() //What arguments here?
【问题讨论】:
构造函数使用可变参数模板生成等效于调用threadfunc(args)
的代码。如果你给它提供导致重载解析失败的参数,你会得到一个编译器错误。
【参考方案1】:
您正在寻找的是parameter pack 运算符。使用它可以编写一个接受可变数量参数的函数。它可以使用这些参数做一些事情,例如将它们转发给另一个函数。
请记住,由于模板是在编译时实例化的,因此在调用站点必须知道参数的数量及其类型。
实现包装线程类的构造函数的简单方法可能是:
template <typename ... Args> // this ctor has variadic template arguments
wrapper_thread(Args& ... args) // pack references to arguments into 'args'
: t(args...) //unpack arguments, pass them as parameters to the ctor of std::thread
一旦您了解了这一点,您就可以查看std::forward()
以进行完美转发。 Andrei Alexandrescu 就可变参数模板进行了精彩的演讲。你可以在这里找到它:http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Variadic-Templates-are-Funadic
【讨论】:
以上是关于std::thread 中的参数。如何运作?的主要内容,如果未能解决你的问题,请参考以下文章