7

是否可以使用 std::async 调用使用 std::bind 创建的函数对象。以下代码无法编译:

#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;
}

错误是:

没有匹配函数调用'async':候选模板被忽略:替换失败[with Fp = std:: _1::function &, Args = <>]:'std:: _1::__invoke_of中没有名为'type'的类型, >

是不能将 async 与 std::function 对象一起使用,还是我做错了什么?

(这是使用 Xcode 5 和 Apple LLVM 5.0 编译器编译的)

4

1 回答 1

14

是否可以调用std::bind使用创建的函数对象std::async

是的,您可以调用任何函子,只要您提供正确数量的参数。

难道我做错了什么?

您正在将不带参数的绑定函数转换为function<int(int,int)>带(并忽略)两个参数的 a ;然后尝试在没有参数的情况下启动它。

您可以指定正确的签名:

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);

或使用 lambda:

auto future = async(launch::async, []{return a.add(1,2);});
于 2013-09-29T14:34:49.710 回答