2012-01-03 2 views
2
다음 코드는 다음과 같은 조건을 만족하는 요소의 수 계산하도록 설계

: 나는 위의 문을 분해부스트 :: 더 큰 표준 : 및 표준 : less_equal와 바인드 작업을 수행하는 방법

(i > 5) && (i <=10) 

std::vector<int> ints; 
.. 
int count=std::count_if(
    ints.begin(), 
    ints.end(), 
    boost::bind(// # bind 1 
    std::logical_and<bool>(), 
    boost::bind(std::greater<int>(),_1,5), // # bind 2 
    boost::bind(std::less_equal<int>(),_1,10))); // # bind 3 

template <class T> struct greater : binary_function <T,T,bool> { 
    bool operator() (const T& x, const T& y) const 
    {return x>y;} 
}; 

을 다음과 같이

boost::bind(std::greater<int>(),_1,5)i > 5

boost::bind(std::less_equal<int>(),_1,10) 사용된다 i <=10 사용된다.

boost::bind(std::greater<int>(),_2,5)i <=10에 사용되는 i > 5 boost::bind(std::less_equal<int>(),_2,10)에 사용됩니다 :

내가 가진 문제는 그 코드를 작성하는 경우 때문에 위의 코드를 이해하고 난 다음를 작성하는 방법입니다.

함수 std::greater에는 두 개의 매개 변수 (예 : xy)가 필요하며 x > y인지 확인해야합니다. 그래서 y5으로 묶어서 Xs을 찾을 수 있다고 생각했습니다. 물론, 제 생각은 잘못되었습니다.

나를 설명 할 수 있습니까? 는 (가장 안쪽) bind 호출이 반환이 아닌 전체 표현이 구축 될 수있는 펑의 매개 변수를 특정 지정 당신에게 등

답변

2

자리 표시 _1, _2을 감사드립니다. 나는. 를 위해 :

boost::bind(std::greater<int>(),_1,5) 

... bind 그것이 greater<int> 펑터에 첫 번째 인수로받는 첫 번째 매개 변수를 전달하는 펑터를 반환합니다.

+0

** # bind 1 **은 ** # bind 2 **와 ** # bind 2 **에'_1'을 제공하여 bool을'std :: logical_and'에 반환합니다. 차례로,'_1'과'5'는 첫 번째와 두 번째 매개 변수로'std :: greater ()'펑터에 주어집니다. – q0987

+0

그래서'_1'은 ** # bind 1 **가받는 첫 번째 매개 변수이고, ** funder에 대한 첫 번째 매개 변수 인 ** #**으로 ** # bind 2 **로 전달됩니다. – q0987

+2

@ q0987 : 죄송합니다. 이전 의견이 오도 된 것 같습니다. 중첩 된 바인드 호출은 내부에서 외부로 해결됩니다. 따라서 'x'가 호출되면 'bind (and, greater (x, 5), less_equal (x, 5) 10))', ... 등 –