STL FunctionObject实现

    技术2022-05-11  92

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

    //通过继承binary_function<_Tp,_Tp,_Tp>来表达各参数间的关系

    //通过重载操作符'()'来达到函数对象的作用,模仿函数的调用.

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

    //转换函数结构的配接器,将返回类型为bool,只接受一个参数的普通函数借口转换为函数对象

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


    最新回复(0)