2013-09-29 2 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; 
} 

오류는 다음과 같습니다 : 다음 코드는 컴파일에 실패

'비동기'에 대한 호출에 대한 일치 기능 : 후보 템플릿 무시 : 대체 실패 [FP가 = 표준 : _1과 : : 기능 &, ARGS = <>] : 표준 '에서'형식 ':: _1 :: __ invoke_of라는 이름의 유형>

그것을인가 그냥 가능한 표준 : : 함수 객체에 비동기 사용하거나 내가 오전 없습니다 뭔가 잘못하고 있는거야?

+0

'async'는 functor 인수를 어디에서 가져 옵니까? 'std :: function '을 전달해보십시오. – juanchopanza

답변

12

예, 당신이 어떤 펑터를 호출 할 수 있습니다 std::async

사용 std::bind로 만든 함수 객체를 호출 할 수 있나요 (이것은 애플의 LLVM 5.0 컴파일러 엑스 코드 5를 사용하여 컴파일되고있다) 적절한 수의 인수를 제공하는 한

내가 잘못 했나요?

당신은 2 개 개의 인수를 취하는 (무시하고)를 function<int(int,int)>로, 인수를 취하지 않는 바운드 기능을 변환하고; 그런 다음 인수없이 실행하려고합니다.

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

또는 전혀 bind 신경 :

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

또는

올바른 서명을 지정할 수 있습니다하십시오 function

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

또는 생성의 오버 헤드를 피하기 람다 사용 :

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