繁体   English   中英

如何在c ++中使用模板对象的模板成员函数创建线程

[英]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是一个类名, multithreadlistmylist<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); })
    });

我没有看到问题。 下面的代码按预期工作

  • Clang 3.8和5.0
  • GCC 5.4.1和7.1.0

不过,我更愿意在另一个答案中解决这个问题。

#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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM