2014-02-20 5 views
2

기본적으로 내가하고 싶은 것은 이것이다. 어떻게 든 getInt으로 호출해야합니다. 그러면 std::plus 함수가 발생하기 바로 전에 발생합니다. 그럼 내가 delayedAdd에 전화 할 때까지 모든 것이 지연 될 필요가 있습니다.지연 함수 호출은

저는 QObject 외부에서 Qt5.0으로 작업 중이므로, 에 λ을 사용할 수 없습니다. 하지만 connectdelayedAdd에서 SLOT으로 변경하고 싶습니다.

+ 당신은 std::bind를 사용하여 함수 호출을 지연시킬 수 있습니다 태그 funception

답변

3

:

using namespace std; 

int getInt() { 
    cout << "getInt!" << endl; 
    return 42; 
} 

function<int(void)> foo = &getInt; 
int magicNumber = 13; 

cout << "before delayed definition" << endl; 
function<int(void)> delayed = std::bind(plus<int>(), magicNumber, bind(foo)); 
cout << "after delayed definition" << endl; 

int i = delayed(); 

cout << "after delayed call" << endl; 

출력 :

지연 정의하기 전에 지연 정의
의 getInt 후
! 지연 호출


당신은 당신이 그랬던 것처럼 하나, foo를 정의 할 필요가 없습니다. , 표준 : : 바인딩에 대한 자세한 내용은

function<int(void)> delayed = bind(plus<int>(), magicNumber, bind(getInt)); 

, N3797 단락 20.9.9을 확인하십시오 당신은 delayed의 정의에 직접 getInt을 바인딩 할 수 있습니다. 좀 더 구체적인 설명은
cppreference 말한다 :

표준 : 바인드 반환 형식
...
멤버 함수 연산자() 바인딩 이전 호출에서 얻은 객체 g을 감안할 때, 함수 호출 식 g (u1, u2, ... uM)에서 호출 될 때 std :: decay :: type 유형의 저장 객체 호출은 다음과 같이 정의 된 인수를 사용하여 수행됩니다.
...
- std :: is_bind_expression :: value == true 인 경우 (즉, 다른 바인드 subexpression이 bind에 대한 초기 호출에서 인수로 사용 된 경우) 바인드 하위 표현식이 즉시 호출되고 해당 결과가 호출 가능한 객체로 전달됩니다. 바인드 서브 표현식에 자리 표시 자 인수가 있으면, u1, u2, ....에서 선택됩니다.
...

+0

Gadzooks! 방금 무슨 일이 있었 니? 바인드가 플러스로 되돌아 오는 유형은 무엇입니까? 나는 bind가 함수 객체를 반환했다고 생각했다. –

+0

몇 가지 있습니다, 당신은 단지 알고 싶지 않다;) –

+0

더 심각하게, http://stackoverflow.com/questions/6412065/what-is-the-return-type-of-boostbind이 질문을 만지지 만, 많은 세부 정보를 제공하지 않습니다. –