bind1st和bind2nd的实现

bind1st和bind2nd的实现

首先看一下下面几个辅助函数和结构体,它们是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调用的参数位置发生了变化而已

你可能感兴趣的:(bind1st和bind2nd的实现)