C++ std线程构造函数采用可变线程函数吗?
我试图将具有相同签名的回调函数的可变计数传递给线程函数。我想出了以下代码C++ std线程构造函数采用可变线程函数吗?,c++,multithreading,variadic-templates,stdthread,C++,Multithreading,Variadic Templates,Stdthread,我试图将具有相同签名的回调函数的可变计数传递给线程函数。我想出了以下代码 using namespace std; void callback(int i) { cout<<"thread "<<i<<" running"<<endl; } template<typename ...CallbackType> void threadProc(int id, CallbackType ...callbackPack) {
using namespace std;
void callback(int i)
{
cout<<"thread "<<i<<" running"<<endl;
}
template<typename ...CallbackType>
void threadProc(int id, CallbackType ...callbackPack)
{
auto callbacks = {callbackPack...};
for(auto callback : callbacks)
{
callback(id);
}
}
int main()
{
thread t(threadProc<void(int)>, 1, callback);
t.join();
return 0;
}
此代码无法使用编译
error: no matching function for call to ‘std::thread::thread(, int, void (&)(int))’
thread t(threadProc<void(int)>, 1, callback);
如果threadProc不使用任何参数包,一切都会很好。使用可变线程函数启动线程是否有正确的方法?您的第一个参数是函数指针,因此请使用
thread t{threadProc<void(*)(int)>, 1, callback};
此处您的第一个参数是函数指针,因此使用
thread t{threadProc<void(*)(int)>, 1, callback};
这里您的代码没有问题。这似乎只是GCC中的一个bug,它与线程无关。再现错误的最小测试用例是:
template <typename... T>
void foo(T...) {}
int main()
{
auto* pfoo = foo<void(int)>;
return 0;
}
或:
你的代码没有问题。这似乎只是GCC中的一个bug,它与线程无关。再现错误的最小测试用例是:
template <typename... T>
void foo(T...) {}
int main()
{
auto* pfoo = foo<void(int)>;
return 0;
}
或: