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

时间:2017-06-25 13:06:22

标签: c++ multithreading templates syntax constructor

我正在创建线程安全列表,我遇到了调用线程构造函数的问题。 我有一个模板类

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无法专门化功能模板&#39; unknown-type std :: invoke(_Callable&amp;&amp;,_ Types&amp;&amp; ...)&#39;和C2672&#39; std :: invoke&#39;:找不到匹配的重载函数

2 个答案:

答案 0 :(得分:7)

最简单的方法是不要打扰[member]函数指针,而只是使用带有适当捕获的lambda表达式:

std::thread t([&](){
        multithreadlist.for_each([](auto&& data){ show(data); })
    });

答案 1 :(得分:0)

我没有看到问题所在。下面的代码在

中按预期工作
  • Clang 3.8 and 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();
}