![](/img/trans.png)
[英]How does std::thread store variadic arguments passed through its constructor?
[英]Does std thread constructor take variadic thread function?
我正在嘗試將可變計數的回調函數(所有相同的簽名)傳遞給線程 function。 我想出了以下代碼
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()
不使用任何參數包,一切都會正常工作。 是否有正確的方法來啟動帶有可變參數線程 function 的線程?
您的第一個參數是 function 指針,因此使用
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 不喜歡foo
具有void(int)
類型的參數這一事實。 然而語言的規則很明確:這是允許的,並且當 function 類型作為參數類型出現時,它會調整為對應的 function 指針類型。
其他編譯器似乎沒有問題。 見https://godbolt.org/z/tgaV7B
作為一種解決方法,您可以編寫:
thread t(threadProc<void(*)(int)>, 1, callback);
或者:
thread t(threadProc<decltype(&callback)>, 1, callback);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.