[英]How to create thread with template member function of a template object in c++
我正在創建線程安全列表,我遇到調用線程構造函數的問題。 我有一個模板類
template <typename T>
class mylist{...}
存儲具有T數據的節點和mylist
得到的成員函數定義如下
template <typename FUNC>
void for_each(FUNC f){...}
為列表中的每個T數據調用f()。 我也有功能
template<typename T>
void show(T data)
{cout<<data<<", ";}
我的問題是我不知道如何制作線程並將此函數傳遞給它。 我試過這個( mylist
是一個類名, multithreadlist
是mylist<size_t>
的對象
std::thread t1(&mylist<size_t>::for_each<void(*)(size_t)>, &multithreadlist, show<size_t>);
我得到C2893無法專門化函數模板'unknown-type std :: invoke(_Callable &&,_ Types && ...)'和C2672'std :: invoke':找不到匹配的重載函數
最簡單的方法是不要打擾[member]函數指針,而是使用帶有適當捕獲的lambda表達式:
std::thread t([&](){
multithreadlist.for_each([](auto&& data){ show(data); })
});
我沒有看到問題。 下面的代碼按預期工作
不過,我更願意在另一個答案中解決這個問題。
#include <iostream>
#include <thread>
#include <vector>
template <typename T>
class mylist
{
std::vector<T> m_list;
public:
mylist(int n) : m_list(n)
{
for (int i = 0; i < n; ++i)
m_list[i] = i;
}
template < typename FUNC >
void for_each(FUNC f)
{
for (auto const& p : m_list)
f(p);
}
};
template<typename T>
void show(T data)
{
std::cout << data << ", ";
}
int main()
{
mylist<size_t> multithreadlist{5};
std::thread t1(&mylist<size_t>::for_each<void(*)(size_t)>, multithreadlist, show<size_t>);
t1.join();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.