[英]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.