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