首先看一下下面几个辅助函数和结构体,它们是bind1st和bind2nd的基础
1.unary_function
这个结构体负责对一元函数的描述:
unary_function
1 template <class _Arg, class _Result>
2 struct unary_function
3 {
4 typedef _Arg argument_type; ///< @c argument_type is the type of the
5 /// argument (no surprises here)
6
7 typedef _Result result_type; ///< @c result_type is the return type
8 };
2.binary_function
这个结构体负责对二元函数的描述:
binary_function
1 template <class _Arg1, class _Arg2, class _Result>
2 struct binary_function
3 {
4 typedef _Arg1 first_argument_type; ///< the type of the first argument
5 /// (no surprises here)
6
7 typedef _Arg2 second_argument_type; ///< the type of the second argument
8 typedef _Result result_type; ///< type of the return type
9 };
3.binder1st类
binder1st
1 template <class _Operation>
2 class binder1st
3 : public unary_function < typename _Operation::second_argument_type,
4 typename _Operation::result_type >
5 {
6 protected:
7 _Operation op;
8 typename _Operation::first_argument_type value;
9 public:
10 binder1st( const _Operation& __x,
11 const typename _Operation::first_argument_type& __y )
12 : op( __x ), value( __y ) {}
13
14 typename _Operation::result_type
15 operator()( const typename _Operation::second_argument_type& __x ) const
16 { return op( value, __x ); }
17
18 // _GLIBCXX_RESOLVE_LIB_DEFECTS
19 // 109. Missing binders for non-const sequence elements
20 typename _Operation::result_type
21 operator()( typename _Operation::second_argument_type& __x ) const
22 { return op( value, __x ); }
23 };
注意7~8行的op和value,分别用来保存绑定的函数操作和值。而在14~16行,可以看到这里直接使用op来处理value和__x参数。
从这两段代码可以看到,binder1st可以把二元函数间接变成一元函数(通过binder1st的operator()调用)。另外,14~15行的result_type、
second_argument_type和first_argument_type也意味着,如果我们自己要写一个可以由bind1st绑定的函数,那么最好是先从unary_function
和binary_function结构体中继承相应的traits,然后再实现operator()函数。
4.bind1st
bind1st函数实质上就是返回了一个binder1st类对象,注意看下面第7行代码:
bind1st
1 /// One of the @link s20_3_6_binder binder functors@endlink.
2 template <class _Operation, class _Tp>
3 inline binder1st<_Operation>
4 bind1st( const _Operation& __fn, const _Tp& __x )
5 {
6 typedef typename _Operation::first_argument_type _Arg1_type;
7 return binder1st<_Operation>( __fn, _Arg1_type( __x ) );
8 }
5.binder2nd和bind2nd
与binder1st和bind1st类似,只是使用Op调用的参数位置发生了变化而已