2013-09-29 51 views
6

是否可以使用std :: async調用使用std :: bind創建的函數對象。下面的代碼無法編譯:可以std :: async調用std :: function對象嗎?

#include <iostream> 
#include <future> 
#include <functional> 

using namespace std; 

class Adder { 
public: 
    int add(int x, int y) { 
     return x + y; 
    } 
}; 

int main(int argc, const char * argv[]) 
{ 
    Adder a; 
    function<int(int, int)> sumFunc = bind(&Adder::add, &a, 1, 2); 
    auto future = async(launch::async, sumFunc); // ERROR HERE 
    cout << future.get(); 
    return 0; 
} 

的錯誤是:

否調用 '異步' 匹配功能: 候選模板忽略:替換故障[與計劃生育=的std :: _1: :功能&,參數數量= <>]:無類型命名爲「性病 '類型' :: _1 :: __ invoke_of,>

難道只是不可能異步使用具有的std ::函數對象還是我做錯了什麼?

+0

從哪裏'async'獲得函數參數?嘗試傳遞'std :: function '。 – juanchopanza

回答

12

是否有可能使用std::async

是的,你可以調用任何仿函數調用與std::bind創建函數對象(這是正在使用的Xcode 5與蘋果LLVM 5.0編譯器編譯) ,只要你提供了正確的參數。

我做錯了什麼?

您正在將不帶參數的綁定函數轉換爲function<int(int,int)>,該函數需要(並忽略)兩個參數;然後嘗試啓動沒有參數。

你可以指定一個正確的簽名:

function<int()> sumFunc = bind(&Adder::add, &a, 1, 2); 

或避免產生的開銷function

auto sumFunc = bind(&Adder::add, &a, 1, 2); 

或不bind麻煩都:

auto future = async(launch::async, &Adder::add, &a, 1, 2); 

或使用拉姆達:

auto future = async(launch::async, []{return a.add(1,2);}); 
相關問題