2009-09-21 2 views

답변

5

항상 사용자 정의 펑터 객체를 정의 할 수 있으므로 엄격히 말하면 이 아닙니다. 하지만 그들은 매우 편리정확하게 피하기 위해은 간단한 경우에 사용자 지정 펑터를 정의해야합니다. 예를 들어 std::vector<int>에있는 항목 수를 > 10으로 집계하려고한다고 가정합니다. 당신은 ... 물론 코드의 수 :

std::count_if(v.begin(), v.end(), gt10()) 

정의한 후 :

class gt10: std::unary_function<int, bool> 
{ 
public: 
    result_type operator()(argument_type i) 
    { 
     return (result_type)(i > 10); 
    } 
}; 

대신, 얼마나 더 편리이 코드에 고려해야 :

std::count_if(v.begin(), v.end(), std::bind1st(std::less<int>(), 10)) 

어떤 보조 펑없이 클래스를 정의해야합니다! -)

+0

맞습니까? bool IsOdd (int i) {return ((i % 2) == 1); } int main() { int mycount; 벡터 myvector; for (int i = 1; i <10; i ++) myvector.push_back (i); // myvector : 1 2 3 4 5 6 7 8 9 mycount = (int) count_if (myvector.begin(), myvector.end(), IsOdd); cout << "myvector는"<< mycount << "홀수 값을 포함합니다. \ n"; return 0; } 출처 : http://www.cplusplus.com/reference/algorithm/count_if/ 그들은 단순한 함수 인 임의의 펑터 객체를 정의하지 않습니다. – Tom

+0

죄송합니다. 코드를 형식화하지 않았지만 코드는 다음과 같습니다. 여기에 : http://www.cplusplus.com/reference/algorithm/count_if/ – Tom

+0

@ 톰, 그렇습니다. 간단히 말해서, 펑터는 함수가 될 수 있지만, 이전에는 (종종 사용 시점과는 거리가 먼) 바인더는 _convenient_합니다. 왜냐하면 그것들을 피할 수 있기 때문입니다 (이미 말했듯이, _convenient _! -). –

1

바인더는 currying을 수행하는 C++ 방식입니다. 감사합니다. Boost Bind 라이브러리를 확인하십시오.