2013-09-29 19 views
6

Có thể gọi các đối tượng hàm được tạo bằng std :: bind sử dụng std :: async hay không. Các mã sau thất bại trong việc biên dịch:Có thể std :: async call std :: đối tượng chức năng?

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

Lỗi này là:

Không có chức năng phù hợp cho cuộc gọi đến 'async': Candidate mẫu bỏ qua: thay thất bại [với fp = std :: _1: : chức năng &, args = <>]: không có loại tên là 'loại' trong 'std :: _1 :: __ invoke_of,>

là nó chỉ không thể sử dụng với các đối tượng async std :: chức năng hay tôi làm gì sai?

(này đã được biên soạn sử dụng Xcode 5 với Apple LLVM 5,0 biên dịch)

+0

nơi sẽ 'async' nhận đối số functor từ? Hãy thử truyền hàm 'std :: '. – juanchopanza

Trả lời

12

Có thể gọi đối tượng chức năng tạo ra với std::bind sử dụng std::async

Có, bạn có thể gọi bất kỳ functor , miễn là bạn cung cấp số lượng đối số phù hợp.

Tôi có làm gì sai không?

Bạn đang chuyển đổi hàm bị ràng buộc, không có đối số, thành một số function<int(int,int)>, mất (và bỏ qua) hai đối số; sau đó cố gắng khởi chạy mà không có đối số.

Bạn có thể chỉ định các chữ ký chính xác:

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

hoặc tránh việc tạo ra một function:

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

hoặc không bận tâm với bind tại tất cả:

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

hoặc sử dụng lambda:

auto future = async(launch::async, []{return a.add(1,2);}); 
Các vấn đề liên quan