gpt4 book ai didi

c++ - std线程构造函数是否采用可变线程函数?

转载 作者:行者123 更新时间:2023-12-02 09:49:06 26 4
gpt4 key购买 nike

我试图将可变数量的回调函数(全部具有相同的签名)传递给线程函数。我想出了以下代码

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()不使用任何参数包,则一切正常。有正确的方法来启动具有可变线程功能的线程吗?

最佳答案

您的代码没有错。这似乎只是GCC中的错误,与线程无关。重现此错误的最小测试用例为:

template <typename... T>
void foo(T...) {}

int main()
{
auto* pfoo = foo<void(int)>;

return 0;
}

似乎GCC不喜欢 foo具有 void(int)类型的参数这一事实。但是语言的规则很明确:这是允许的,并且当函数类型作为参数类型出现时,会将函数类型调整为相应的函数指针类型。

其他编译器似乎对此没有问题。参见 https://godbolt.org/z/tgaV7B

作为一种解决方法,您可以编写:
thread t(threadProc<void(*)(int)>, 1, callback);

或者:
thread t(threadProc<decltype(&callback)>, 1, callback);

关于c++ - std线程构造函数是否采用可变线程函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62096519/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com