2013-09-29 36 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);}); 
相关问题