function object 연구의 6 bind example

1752 단어
이 시리즈는 주로boost::bind의 실현 원리를 이해하고 연구의 4가지 간단한 사용 예로 돌아가기를 희망한다.코드를 조금 추가하고 Foo 함수도 바인딩합니다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <boost/bind.hpp>
using namespace std;

bool Foo(int x) {
    return x >= 2;
}

typedef bool (*FooPointer)(int x);

int main(int argc, char** argv) {
    FooPointer p = Foo;
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    
    // bind Foo function
    vector<int>::iterator itor = std::find_if(v.begin(), v.end(),
        boost::bind(Foo, _1));
    cout << *itor << endl;
    
    // bind FooPointer
    itor = std::find_if(v.begin(), v.end(),
            boost::bind(p, _1));
    cout << *itor << endl;
    return 0;
}
두 번의 검색에는 각각 Foo 함수와 FooPointer 함수 바늘이 사용되었다.
boost는 일부 bind 재부팅 템플릿 함수를 제공합니다. bind는 실제로는 매크로를 통해 나타납니다.hpp에서는 다음과 같이 정의됩니다.
#ifndef BOOST_BIND
#define BOOST_BIND bind
#endif

첫 번째 bind(foo, 1)는 다음 재로드 형식을 사용합니다.
template<class R, class F, class A1>
    _bi::bind_t<R, F, typename _bi::list_av_1<A1>::type>
    BOOST_BIND(F f, A1 a1)
{
    typedef typename _bi::list_av_1<A1>::type list_type;
    return _bi::bind_t<R, F, list_type> (f, list_type(a1));
}
그래서 여기서 Ff는 바로 Foo 함수를 가리킨다. 이곳은 약간 재미있다. 왜냐하면 함수 Foo는 유형처럼 템플릿 매개 변수로 전달할 수 있기 때문이다.나는 이전에 이렇게 써 본 적이 없다.
신속하게 실험을 해보자:
template <typename F>
void Test(F f){
    cout << f(2);
}
int main(int argc, char** argv) {
    Test(Foo);
    return 0;
}
컴파일 실행 성공, 출력 결과 1.
A1 a1은 외부에서 코드를 호출해서 전달되는 을 가리킨다1.

좋은 웹페이지 즐겨찾기