C++ STL源码学习(仿函数篇)

来源:互联网 发布:印度直播软件 编辑:程序博客网 时间:2024/05/16 17:25



stl_function.h

///仿函数的实现并不复杂template <class _Arg, class _Result>struct unary_function{    typedef _Arg argument_type;    typedef _Result result_type;};template <class _Arg1, class _Arg2, class _Result>struct binary_function{    typedef _Arg1 first_argument_type;    typedef _Arg2 second_argument_type;    typedef _Result result_type;};template <class _Tp>struct plus : public binary_function<_Tp,_Tp,_Tp>{    _Tp operator()(const _Tp& __x, const _Tp& __y) const    {        return __x + __y;    }};template <class _Tp>struct minus : public binary_function<_Tp,_Tp,_Tp>{    _Tp operator()(const _Tp& __x, const _Tp& __y) const    {        return __x - __y;    }};template <class _Tp>struct multiplies : public binary_function<_Tp,_Tp,_Tp>{    _Tp operator()(const _Tp& __x, const _Tp& __y) const    {        return __x * __y;    }};template <class _Tp>struct divides : public binary_function<_Tp,_Tp,_Tp>{    _Tp operator()(const _Tp& __x, const _Tp& __y) const    {        return __x / __y;    }};/// identity_element (not part of the C++ standard).template <class _Tp> inline _Tp identity_element(plus<_Tp>){    return _Tp(0);}template <class _Tp> inline _Tp identity_element(multiplies<_Tp>){    return _Tp(1);}template <class _Tp>struct modulus : public binary_function<_Tp,_Tp,_Tp>{    _Tp operator()(const _Tp& __x, const _Tp& __y) const    {        return __x % __y;    }};template <class _Tp>struct negate : public unary_function<_Tp,_Tp>{    _Tp operator()(const _Tp& __x) const    {        return -__x;    }};template <class _Tp>struct equal_to : public binary_function<_Tp,_Tp,bool>{    bool operator()(const _Tp& __x, const _Tp& __y) const    {        return __x == __y;    }};template <class _Tp>struct not_equal_to : public binary_function<_Tp,_Tp,bool>{    bool operator()(const _Tp& __x, const _Tp& __y) const    {        return __x != __y;    }};template <class _Tp>struct greater : public binary_function<_Tp,_Tp,bool>{    bool operator()(const _Tp& __x, const _Tp& __y) const    {        return __x > __y;    }};template <class _Tp>struct less : public binary_function<_Tp,_Tp,bool>{    bool operator()(const _Tp& __x, const _Tp& __y) const    {        return __x < __y;    }};template <class _Tp>struct greater_equal : public binary_function<_Tp,_Tp,bool>{    bool operator()(const _Tp& __x, const _Tp& __y) const    {        return __x >= __y;    }};template <class _Tp>struct less_equal : public binary_function<_Tp,_Tp,bool>{    bool operator()(const _Tp& __x, const _Tp& __y) const    {        return __x <= __y;    }};template <class _Tp>struct logical_and : public binary_function<_Tp,_Tp,bool>{    bool operator()(const _Tp& __x, const _Tp& __y) const    {        return __x && __y;    }};template <class _Tp>struct logical_or : public binary_function<_Tp,_Tp,bool>{    bool operator()(const _Tp& __x, const _Tp& __y) const    {        return __x || __y;    }};template <class _Tp>struct logical_not : public unary_function<_Tp,bool>{    bool operator()(const _Tp& __x) const    {        return !__x;    }};///将传入的函数对象存储,调用该对象的函数调用操作符时,调用///保存对象的函数调用操作符,并对其返回值求反,再作为该对象///函数调用操作符的返回值template <class _Predicate>class unary_negate    : public unary_function<typename _Predicate::argument_type, bool>{protected:    _Predicate _M_pred;public:    explicit unary_negate(const _Predicate& __x) : _M_pred(__x) {}    bool operator()(const typename _Predicate::argument_type& __x) const    {        return !_M_pred(__x);    }};template <class _Predicate>inline unary_negate<_Predicate>not1(const _Predicate& __pred){    return unary_negate<_Predicate>(__pred);}template <class _Predicate>class binary_negate    : public binary_function<typename _Predicate::first_argument_type,      typename _Predicate::second_argument_type,      bool>{protected:    _Predicate _M_pred;public:    explicit binary_negate(const _Predicate& __x) : _M_pred(__x) {}    bool operator()(const typename _Predicate::first_argument_type& __x,                    const typename _Predicate::second_argument_type& __y) const    {        return !_M_pred(__x, __y);    }};template <class _Predicate>inline binary_negate<_Predicate>not2(const _Predicate& __pred){    return binary_negate<_Predicate>(__pred);}///将传入的函数对象和其第一个参数保存,待需要时,再行绑定template <class _Operation>class binder1st    : public unary_function<typename _Operation::second_argument_type,      typename _Operation::result_type>{protected:    _Operation op;    typename _Operation::first_argument_type value;public:    binder1st(const _Operation& __x,              const typename _Operation::first_argument_type& __y)        : op(__x), value(__y) {}    typename _Operation::result_type    operator()(const typename _Operation::second_argument_type& __x) const    {        return op(value, __x);    }};template <class _Operation, class _Tp>inline binder1st<_Operation>bind1st(const _Operation& __fn, const _Tp& __x){    typedef typename _Operation::first_argument_type _Arg1_type;    return binder1st<_Operation>(__fn, _Arg1_type(__x));}template <class _Operation>class binder2nd    : public unary_function<typename _Operation::first_argument_type,      typename _Operation::result_type>{protected:    _Operation op;    typename _Operation::second_argument_type value;public:    binder2nd(const _Operation& __x,              const typename _Operation::second_argument_type& __y)        : op(__x), value(__y) {}    typename _Operation::result_type    operator()(const typename _Operation::first_argument_type& __x) const    {        return op(__x, value);    }};template <class _Operation, class _Tp>inline binder2nd<_Operation>bind2nd(const _Operation& __fn, const _Tp& __x){    typedef typename _Operation::second_argument_type _Arg2_type;    return binder2nd<_Operation>(__fn, _Arg2_type(__x));}/// unary_compose and binary_compose (extensions, not part of the standard).///将两个医院函数组合为一个一元参数,第二个函数的返回值作为第一个函数的参数template <class _Operation1, class _Operation2>class unary_compose    : public unary_function<typename _Operation2::argument_type,      typename _Operation1::result_type>{protected:    _Operation1 _M_fn1;    _Operation2 _M_fn2;public:    unary_compose(const _Operation1& __x, const _Operation2& __y)        : _M_fn1(__x), _M_fn2(__y) {}    typename _Operation1::result_type    operator()(const typename _Operation2::argument_type& __x) const    {        return _M_fn1(_M_fn2(__x));    }};template <class _Operation1, class _Operation2>inline unary_compose<_Operation1,_Operation2>compose1(const _Operation1& __fn1, const _Operation2& __fn2){    return unary_compose<_Operation1,_Operation2>(__fn1, __fn2);}template <class _Operation1, class _Operation2, class _Operation3>class binary_compose    : public unary_function<typename _Operation2::argument_type,      typename _Operation1::result_type>{protected:    _Operation1 _M_fn1;    _Operation2 _M_fn2;    _Operation3 _M_fn3;public:    binary_compose(const _Operation1& __x, const _Operation2& __y,                   const _Operation3& __z)        : _M_fn1(__x), _M_fn2(__y), _M_fn3(__z) { }    typename _Operation1::result_type    operator()(const typename _Operation2::argument_type& __x) const    {        return _M_fn1(_M_fn2(__x), _M_fn3(__x));    }};template <class _Operation1, class _Operation2, class _Operation3>inline binary_compose<_Operation1, _Operation2, _Operation3>compose2(const _Operation1& __fn1, const _Operation2& __fn2,         const _Operation3& __fn3){    return binary_compose<_Operation1,_Operation2,_Operation3>           (__fn1, __fn2, __fn3);}template <class _Arg, class _Result>class pointer_to_unary_function : public unary_function<_Arg, _Result>{protected:///返回值为_Result类型,参数类型为_Arg的函数指针    _Result (*_M_ptr)(_Arg);public:    pointer_to_unary_function() {}    explicit pointer_to_unary_function(_Result (*__x)(_Arg)) : _M_ptr(__x) {}    _Result operator()(_Arg __x) const    {        return _M_ptr(__x);    }};template <class _Arg, class _Result>inline pointer_to_unary_function<_Arg, _Result> ptr_fun(_Result (*__x)(_Arg)){    return pointer_to_unary_function<_Arg, _Result>(__x);}template <class _Arg1, class _Arg2, class _Result>class pointer_to_binary_function :    public binary_function<_Arg1,_Arg2,_Result>{protected:    _Result (*_M_ptr)(_Arg1, _Arg2);public:    pointer_to_binary_function() {}    explicit pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2))        : _M_ptr(__x) {}    _Result operator()(_Arg1 __x, _Arg2 __y) const    {        return _M_ptr(__x, __y);    }};template <class _Arg1, class _Arg2, class _Result>inline pointer_to_binary_function<_Arg1,_Arg2,_Result>ptr_fun(_Result (*__x)(_Arg1, _Arg2)){    return pointer_to_binary_function<_Arg1,_Arg2,_Result>(__x);}/// identity is an extensions: it is not part of the standard.template <class _Tp>struct _Identity : public unary_function<_Tp,_Tp>{    const _Tp& operator()(const _Tp& __x) const    {        return __x;    }};template <class _Tp> struct identity : public _Identity<_Tp> {};/// select1st and select2nd are extensions: they are not part of the standard.///_Select1st和_Select2nd为了在map和multimap中作为根据值推导键的函数来提供的///除此之外,STL中未用到template <class _Pair>struct _Select1st : public unary_function<_Pair, typename _Pair::first_type>{    const typename _Pair::first_type& operator()(const _Pair& __x) const    {        return __x.first;    }};template <class _Pair>struct _Select2nd : public unary_function<_Pair, typename _Pair::second_type>{    const typename _Pair::second_type& operator()(const _Pair& __x) const    {        return __x.second;    }};template <class _Pair> struct select1st : public _Select1st<_Pair> {};template <class _Pair> struct select2nd : public _Select2nd<_Pair> {};///由于成员函数的调用,隐式传递了一个this指针,因此只需要将这个this指针///变成显式传递,即可当做普通函数使用,STL成员函数适配器即采用这种方法///将_Tp类的对象指针和其返回值为_Ret,参数为空的成员函数绑定,生成///一个一元函数,该一元函数的参数为_Tp类指针template <class _Ret, class _Tp>class mem_fun_t : public unary_function<_Tp*,_Ret>{public:    explicit mem_fun_t(_Ret (_Tp::*__pf)()) : _M_f(__pf) {}    _Ret operator()(_Tp* __p) const    {        return (__p->*_M_f)();    }private:    _Ret (_Tp::*_M_f)();};///将_Tp类的对象指针和其返回值为_Ret,参数为空的常成员函数绑定,生成///一个一元函数,该一元函数的参数为指向const Tp 类的指针template <class _Ret, class _Tp>class const_mem_fun_t : public unary_function<const _Tp*,_Ret>{public:    explicit const_mem_fun_t(_Ret (_Tp::*__pf)() const) : _M_f(__pf) {}    _Ret operator()(const _Tp* __p) const    {        return (__p->*_M_f)();    }private:    _Ret (_Tp::*_M_f)() const;};///将_Tp类的对象和其返回值为_Ret,参数为空的成员函数绑定,生成///一个一元函数template <class _Ret, class _Tp>class mem_fun_ref_t : public unary_function<_Tp,_Ret>{public:    explicit mem_fun_ref_t(_Ret (_Tp::*__pf)()) : _M_f(__pf) {}    _Ret operator()(_Tp& __r) const    {        return (__r.*_M_f)();    }private:    _Ret (_Tp::*_M_f)();};///将_Tp类的对象和其返回值为_Ret,参数为空的常成员函数绑定,生成///一个一元函数template <class _Ret, class _Tp>class const_mem_fun_ref_t : public unary_function<_Tp,_Ret>{public:    explicit const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const) : _M_f(__pf) {}    _Ret operator()(const _Tp& __r) const    {        return (__r.*_M_f)();    }private:    _Ret (_Tp::*_M_f)() const;};///将_Tp类的对象和其返回值为_Ret,参数为_Arg类型的常成员函数绑定,生成///一个二元函数template <class _Ret, class _Tp, class _Arg>class mem_fun1_t : public binary_function<_Tp*,_Arg,_Ret>{public:    explicit mem_fun1_t(_Ret (_Tp::*__pf)(_Arg)) : _M_f(__pf) {}    _Ret operator()(_Tp* __p, _Arg __x) const    {        return (__p->*_M_f)(__x);    }private:    _Ret (_Tp::*_M_f)(_Arg);};template <class _Ret, class _Tp, class _Arg>class const_mem_fun1_t : public binary_function<const _Tp*,_Arg,_Ret>{public:    explicit const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const) : _M_f(__pf) {}    _Ret operator()(const _Tp* __p, _Arg __x) const    {        return (__p->*_M_f)(__x);    }private:    _Ret (_Tp::*_M_f)(_Arg) const;};template <class _Ret, class _Tp, class _Arg>class mem_fun1_ref_t : public binary_function<_Tp,_Arg,_Ret>{public:    explicit mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg)) : _M_f(__pf) {}    _Ret operator()(_Tp& __r, _Arg __x) const    {        return (__r.*_M_f)(__x);    }private:    _Ret (_Tp::*_M_f)(_Arg);};template <class _Ret, class _Tp, class _Arg>class const_mem_fun1_ref_t : public binary_function<_Tp,_Arg,_Ret>{public:    explicit const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const) : _M_f(__pf) {}    _Ret operator()(const _Tp& __r, _Arg __x) const    {        return (__r.*_M_f)(__x);    }private:    _Ret (_Tp::*_M_f)(_Arg) const;};template <class _Ret, class _Tp>inline mem_fun_t<_Ret,_Tp> mem_fun(_Ret (_Tp::*__f)()){    return mem_fun_t<_Ret,_Tp>(__f);}template <class _Ret, class _Tp>inline const_mem_fun_t<_Ret,_Tp> mem_fun(_Ret (_Tp::*__f)() const){    return const_mem_fun_t<_Ret,_Tp>(__f);}template <class _Ret, class _Tp>inline mem_fun_ref_t<_Ret,_Tp> mem_fun_ref(_Ret (_Tp::*__f)()){    return mem_fun_ref_t<_Ret,_Tp>(__f);}template <class _Ret, class _Tp>inline const_mem_fun_ref_t<_Ret,_Tp> mem_fun_ref(_Ret (_Tp::*__f)() const){    return const_mem_fun_ref_t<_Ret,_Tp>(__f);}template <class _Ret, class _Tp, class _Arg>inline mem_fun1_t<_Ret,_Tp,_Arg> mem_fun(_Ret (_Tp::*__f)(_Arg)){    return mem_fun1_t<_Ret,_Tp,_Arg>(__f);}template <class _Ret, class _Tp, class _Arg>inline const_mem_fun1_t<_Ret,_Tp,_Arg> mem_fun(_Ret (_Tp::*__f)(_Arg) const){    return const_mem_fun1_t<_Ret,_Tp,_Arg>(__f);}template <class _Ret, class _Tp, class _Arg>inline mem_fun1_ref_t<_Ret,_Tp,_Arg> mem_fun_ref(_Ret (_Tp::*__f)(_Arg)){    return mem_fun1_ref_t<_Ret,_Tp,_Arg>(__f);}template <class _Ret, class _Tp, class _Arg>inline const_mem_fun1_ref_t<_Ret,_Tp,_Arg>mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const){    return const_mem_fun1_ref_t<_Ret,_Tp,_Arg>(__f);}template <class _Ret, class _Tp, class _Arg>inline mem_fun1_t<_Ret,_Tp,_Arg> mem_fun1(_Ret (_Tp::*__f)(_Arg)){    return mem_fun1_t<_Ret,_Tp,_Arg>(__f);}template <class _Ret, class _Tp, class _Arg>inline const_mem_fun1_t<_Ret,_Tp,_Arg> mem_fun1(_Ret (_Tp::*__f)(_Arg) const){    return const_mem_fun1_t<_Ret,_Tp,_Arg>(__f);}template <class _Ret, class _Tp, class _Arg>inline mem_fun1_ref_t<_Ret,_Tp,_Arg> mem_fun1_ref(_Ret (_Tp::*__f)(_Arg)){    return mem_fun1_ref_t<_Ret,_Tp,_Arg>(__f);}template <class _Ret, class _Tp, class _Arg>inline const_mem_fun1_ref_t<_Ret,_Tp,_Arg>mem_fun1_ref(_Ret (_Tp::*__f)(_Arg) const){    return const_mem_fun1_ref_t<_Ret,_Tp,_Arg>(__f);}



0 0
原创粉丝点击