functionobject 연구의 15list1 분석

5280 단어
일단 bind를 볼게요.hpp의 list0 템플릿 정의:
class list0
{
public:

    list0() {}

    template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); }

    template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); }

    template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }

    template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }

    template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }

    template<class R, class F, class A> R operator()(type<R>, F & f, A &, long)
    {
        return unwrapper<F>::unwrap(f, 0)();
    }

    template<class R, class F, class A> R operator()(type<R>, F const & f, A &, long) const
    {
        return unwrapper<F const>::unwrap(f, 0)();
    }

    template<class F, class A> void operator()(type<void>, F & f, A &, int)
    {
        unwrapper<F>::unwrap(f, 0)();
    }

    template<class F, class A> void operator()(type<void>, F const & f, A &, int) const
    {
        unwrapper<F const>::unwrap(f, 0)();
    }

    template<class V> void accept(V &) const
    {
    }

    bool operator==(list0 const &) const
    {
        return true;
    }
};

accept 방법을 제공하여 V&를 받아들였지만 아무런 실현도 없었다.Operator 재부팅 함수를 제공하고operator () () () 의 함수에 중점을 두는 것은 사실list0이functionobject라는 것을 설명한다.
1. type은 무엇입니까?정의는 다음과 같습니다.
template<class T> class type {};
일반적인 템플릿일 뿐, 어떤 유형도 받아들일 수 있습니다.
2. unwrap(f,0)의 결과는 f를 되돌려줍니다. 따라서 f가 하나의 함수로operator()(type, F&f, A&,long)에 전달되면 내부의 unwrap(f,0)은 f를 되돌려줍니다.
따라서 실제 코드는 f를 직접 호출하는 코드로 컴파일되었습니다: f ()
이것은 컴파일러가 컴파일러에서 함수 코드를 호출하도록 하는 좋은 기교이다.
unwrap은 또 다른 두 가지 유형을 받아들인다. 참고:http://blog.csdn.net/sheismylife/article/details/8272615
그래서 기능이 비교적 강하다.
3. 실제로 f 함수가 실행될 때 전달되는 매개 변수는 비어 있습니다. 아래에 매개 변수의 예를 볼 수 있습니다.
list1의 정의를 계속 보려면:
template< class A1 > class list1: private storage1< A1 >
{
private:

    typedef storage1< A1 > base_type;

public:

    explicit list1( A1 a1 ): base_type( a1 ) {}

    A1 operator[] (boost::arg<1>) const { return base_type::a1_; }

    A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; }

    template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }

    template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }

    template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }

    template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }

    template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }

    template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long)
    {
        return unwrapper<F>::unwrap(f, 0)(a[base_type::a1_]);
    }

    template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const
    {
        return unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_]);
    }

    template<class F, class A> void operator()(type<void>, F & f, A & a, int)
    {
        unwrapper<F>::unwrap(f, 0)(a[base_type::a1_]);
    }

    template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const
    {
        unwrapper<F const>::unwrap(f, 0)(a[base_type::a1_]);
    }

    template<class V> void accept(V & v) const
    {
        base_type::accept(v);
    }

    bool operator==(list1 const & rhs) const
    {
        return ref_compare(base_type::a1_, rhs.a1_, 0);
    }
};
오랜 친구 많이 보셨죠?
1.storage1에서 계승하여 앞의 문장을 되돌아본다.http://blog.csdn.net/sheismylife/article/details/8269153
그래서 a1_를 가지게 되었고,여기서 왜 특화된 버전의storag1이 a1_를 정의하지 않았는지 모르겠지만,a1 () 정적 함수만 있는데, 뜻밖에도 여기에 있다.아래의 코드는 컴파일되어 통과되었다.
    boost::_bi::storage1<boost::arg<1> > x(_1);
    x.a1_;

2.operator[]() 함수 몇 개가 재미있어요._로1 다음 표로 첫 번째 재부팅을 호출합니다.
list[_1];

-->

A1 operator[] (boost::arg<1>) const { return base_type::a1_; }

3.operator()() 함수의 매개 변수 A & a는 실제로list1 대상이며 안에 있는 a_구성원은 외부에서 실제로 호출되는 매개 변수입니다.
a[base_type::a1_] 이 코드는 다음과 같습니다.
this 객체를 통한 base_type::a1_,이때 a1_포인터 함수입니다. 자리 표시자 boost::arg<1>을 되돌려줍니다.
a1_로매개 변수로 a대상에 전달된operator[](boost::arg<1>(*)() 방법으로 내부에 저장된 실제 매개 변수를 가져옵니다.
a 객체와this 객체는 모두 템플릿list1<>에서 진화한 것이지만 같은 객체가 아닙니다.
4. 다른 함수는 모두 비교적 간단하다. accept 이전에도 소개했듯이visitor 모델의 실현.

좋은 웹페이지 즐겨찾기