2013-09-08 5 views
1

자리 표시 자 사용과 관련하여 너무 많은 예제가 있지만 다음과 같은 두 문장의 차이점을 설명 할 수 있다면 조금 혼란 스러울 것입니다.다음 예제에서 Boost :: bind의 자리 표시 자 역할

void SomeMethod(int a) 
{ 
    std::cout << "Parameter pass " << a << "\n"; 
} 

Statement 1 : boost::bind(&SomeMethod,_1)(12); 

Statement 2 : boost::bind(&SomeMethod,12)(); 

저는 체인 1 인 문장 1을 이해합니다. boost::bind(&SomeMethod,_1)의 출력에는 12의 매개 변수가 첨부됩니다. 그러나 나는 statement 2에서 일어나는 일을 이해하는 데 어려움이있다. 매개 변수가 boost :: bind를 사용하여 직접 전달 될 수 있다면 (statement 2에서와 같이) 왜 placeholder가 필요한가? 자리의 용도

+1

'bind'의 결과를 즉시 호출하고 싶다면 처음에는'bind'가 필요 없습니다. 실제 사용 사례는 이제 'bind'를 호출하고 결과 300 함수와 5000 라인을 호출합니다. –

답변

4

하나

예 과급 찍은 특정 함수의 인수의 순서를 변경한다. 이전에 f(x, y)g(x,y,z)이 있다고 가정합니다. 그런 다음

bind(f, _2, _1)(x, y);     // f(y, x)  
bind(g, _1, 9, _1)(x);     // g(x, 9, x)  
bind(g, _3, _3, _3)(x, y, z);   // g(z, z, z)  
bind(g, _1, _1, _1)(x, y, z);   // g(x, x, x) 

그 마지막 예에서, 바인드 (g,에 의해 생성 된 함수 객체 _1, _1, _1 마지막 예를

주에 대한 다음 BOOST 가이드 문을주의하는 것이 재미있다)에는 첫 번째 인수 이외의 인수에 대한 참조가 들어 있지 않지만 두 개 이상의 인수와 함께 계속 사용될 수 있습니다. 첫 번째와 두 번째 인수가 세 번째 예제에서 무시되는 것처럼 추가 인수는 자동으로 무시됩니다.

자리 표시자가 이런 종류의 대체 청소기를 만들고 우아한 것으로 생각합니다.

특별한 경우, 2 가지 용도는 동일합니다.

일부 인수 만 선택적으로 바인딩 할 수 있습니다. bind (f, _1, 5) (x)는 f (x, 5)와 동일하다. 여기 _1은 "첫 번째 입력 인수로 대체"를 의미하는 자리 표시 자 인수입니다.

또 다른 좋은 자리 표시자는 인수가 많고 그 중 하나만 바인딩하려는 경우입니다. 예 : h(a,b,c,d,e,f,g)을 상상해보십시오. 그러면 여섯 번째 인수를 바인딩하기 만하면됩니다!