function object 연구의 18bind_t

3388 단어
bind_t 템플릿은 bind에 정의됩니다.hpp:
#ifndef BOOST_NO_VOID_RETURNS

template<class R, class F, class L> class bind_t
{
public:

    typedef bind_t this_type;

    bind_t(F f, L const & l): f_(f), l_(l) {}

#define BOOST_BIND_RETURN return
#include <boost/bind/bind_template.hpp>
#undef BOOST_BIND_RETURN

};

#else

구현 코드가 많기 때문에 hpp 파일에 넣고 bind_t 내부는 include로 이 파일을 가져옵니다.이런 용법은 매우 재미있다.
여기서 멤버 변수는 다음과 같습니다.
private:

    F f_;
    L l_;
따라서 bind_t 구조 함수는 매개 변수 f와 l를 개인 변수에 저장합니다.
두 가지 유형을 동시에 정의합니다.
    typedef bind_t this_type;

    typedef typename result_traits<R, F>::type result_type;
여기result_타입은 R입니다.
이어서 Operator () (T...) 를 제공했다에 대한 재부팅 작업자입니다.
T는void일 수도 있고 여러 boost::arg 매개 변수일 수도 있습니다.
result_type operator()()
    {
        list0 a;
        BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    }

    result_type operator()() const
    {
        list0 a;
        BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    }

이 두 가지는 무참한 형식이다.
l_() 이 문장은operator () () 함수를 호출한 것입니다.설명l_함수 개체입니다.
그리고 매개 변수가 없는list0 대상 a를 전달합니다.
    template<class A1> result_type operator()(A1 & a1)
    {
        list1<A1 &> a(a1);
        BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    }

    template<class A1> result_type operator()(A1 & a1) const
    {
        list1<A1 &> a(a1);
        BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    }

이 두 개와 앞의 차이는 많지 않다. 바로 매개 변수가 많아졌다. 반면list1에서 l_를 호출한다.변수의operator()().
    template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8, A9 & a9)
    {
        list9<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &, A8 &, A9 &> a(a1, a2, a3, a4, a5, a6, a7, a8, a9);
        BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    }

    template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8, A9 & a9) const
    {
        list9<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &, A8 &, A9 &> a(a1, a2, a3, a4, a5, a6, a7, a8, a9);
        BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
    }

이 두 개는 9개의 매개 변수를 수신하는 형식이다.
요약: 템플릿bind_t는 두 개의 매개 변수를 받아들인다. 하나는 실행하는 함수 f(또는 함수 바늘 등 형식), 하나는functionobjectl이다.
또한 많은 operator () () 를 제공하여 0-9에서 서로 다른 수의 매개 변수를 수신하고 내부적으로functionobjectl의operator () () 를 실행하여 f를 실행합니다. 매개 변수는 실행할 때 외부 호출 프로그램에서 전송됩니다.
accept 지원visitor 모드도 제공합니다.
return type도 외부 프로그램에서 지정할 수 있으며, 템플릿 매개 변수 R로bind_t.
여기에 호출된 예가 있습니다.
typedef typename _bi::list_av_1<A1>::type list_type;
return _bi::bind_t<R, F, list_type> (f, list_type(a1));
그래서 이때 l 매개 변수는list_type(a1), 즉list_av_1:type, 즉list1, 이때 a1은_1, 따라서 A1은 boost::arg<1> 유형이다.

좋은 웹페이지 즐겨찾기