2016-08-16 33 views
1

我正在使用simple multithreaded library來嘗試理解基本知識。在多線程庫中轉換未來

的lib中有一個排隊功能,看起來像這樣:

auto enqueue(F&& f, Args&&... args) 
-> std::future<typename std::result_of<F(Args...)>::type>; 

並存儲的功能是這樣的:

std::queue< std::function<void()> > tasks; 

有關於如何通過lambda表達式的例子,但我想傳遞成員變量。所以我創建了一個小對象:

Threadpool tp(4); 

class myClass{ 
    vector<std::future<int>> res; 
public: 
    int compute(int i){ 
    return 2 * i; 
    }; 
    void update(){ 
    for(int i = 0; i < 10; i++){ 
     res.emplace_back(
      // C2664 - 'std::future<int>::future(const std::future<int> &)': 
      // cannot convert argument 1 from 'std::future<_Rx>' to 'std::future<int> &&' 
      tp.enqueue(std::bind(&myClass::compute, this), i) 
     ); 
    }; 
    } 
}; 

創建無參數函數的工作原理。但是,即使在網站上的例子拉姆達可與傳遞的參數:

tp.enqueue([](int answer) { return answer; }, 42); 

什麼我沒有得到嗎?

另外一個側面的問題:當涉及到標準的功能是什麼用的優勢:

auto fn(...) -> return type 

代替:

return type fn(...) 
+1

缺少'bind'的佔位符:標準::綁定(&MyClass的::計算,此,/ *的std ::佔位符:: */_ 1)' – Jarod42

+1

後返回'類型允許在'decltype'中使用參數,並允許使用範圍類型(​​所以'auto C :: foo() - > iterator',而不是'typename C :: iterator') – Jarod42

+0

謝謝你的答案,缺失的佔位符是問題。 – val

回答

3

佔位符丟失:

tp.enqueue(std::bind(&myClass::compute, this, std::placeholders::_1), i); 

或簡單地

tp.enqueue(std::bind(&myClass::compute, this, i)); 

或拉姆達

tp.enqueue([=]() { this->compute(i); }); 
+0

@val:也許你的庫也支持'tp.enqueue(&myClass :: compute,this,i);'。 – Jarod42