STL FunctionObject实现 - 2

    技术2022-05-11  124

    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));}

    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 (*_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);}//将普通函数转换为函数对象,接口转换,配接器的实现原理


    最新回复(0)