functionobject 연구의 15list1 분석
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 ()
이것은 컴파일러가 컴파일러에서 함수 코드를 호출하도록 하는 좋은 기교이다.
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
그래서 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[base_type::a1_] 이 코드는 다음과 같습니다.
this 객체를 통한 base_type::a1_,이때 a1_포인터 함수입니다. 자리 표시자 boost::arg<1>을 되돌려줍니다.
a1_로매개 변수로 a대상에 전달된operator[](boost::arg<1>(*)() 방법으로 내부에 저장된 실제 매개 변수를 가져옵니다.
a 객체와this 객체는 모두 템플릿list1<>에서 진화한 것이지만 같은 객체가 아닙니다.
4. 다른 함수는 모두 비교적 간단하다. accept 이전에도 소개했듯이visitor 모델의 실현.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.