簡體   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