举例

先上一个例子,看看怎么用它

 1std::mem_fun_ref,mem_fun1_ref分析#include <functional>
 2std::mem_fun_ref,mem_fun1_ref分析#include <stdio.h>
 3std::mem_fun_ref,mem_fun1_ref分析
 4std::mem_fun_ref,mem_fun1_ref分析struct A
 5std::mem_fun_ref,mem_fun1_ref分析std::mem_fun_ref,mem_fun1_ref分析std::mem_fun_ref,mem_fun1_ref分析{
 6std::mem_fun_ref,mem_fun1_ref分析    A(int n):n_(n)
 7std::mem_fun_ref,mem_fun1_ref分析std::mem_fun_ref,mem_fun1_ref分析    std::mem_fun_ref,mem_fun1_ref分析{
 8std::mem_fun_ref,mem_fun1_ref分析    }
 9std::mem_fun_ref,mem_fun1_ref分析    
10std::mem_fun_ref,mem_fun1_ref分析    int add(int n)
11std::mem_fun_ref,mem_fun1_ref分析std::mem_fun_ref,mem_fun1_ref分析    std::mem_fun_ref,mem_fun1_ref分析{
12std::mem_fun_ref,mem_fun1_ref分析        return n+n_;
13std::mem_fun_ref,mem_fun1_ref分析    }
14std::mem_fun_ref,mem_fun1_ref分析    
15std::mem_fun_ref,mem_fun1_ref分析    int test()
16std::mem_fun_ref,mem_fun1_ref分析std::mem_fun_ref,mem_fun1_ref分析    std::mem_fun_ref,mem_fun1_ref分析{
17std::mem_fun_ref,mem_fun1_ref分析        return n_;
18std::mem_fun_ref,mem_fun1_ref分析    }
19std::mem_fun_ref,mem_fun1_ref分析    
20std::mem_fun_ref,mem_fun1_ref分析    int n_;
21std::mem_fun_ref,mem_fun1_ref分析};
22std::mem_fun_ref,mem_fun1_ref分析
23std::mem_fun_ref,mem_fun1_ref分析void main()
24std::mem_fun_ref,mem_fun1_ref分析std::mem_fun_ref,mem_fun1_ref分析std::mem_fun_ref,mem_fun1_ref分析{
25std::mem_fun_ref,mem_fun1_ref分析    A a(10);
26std::mem_fun_ref,mem_fun1_ref分析    int n = std::mem_fun_ref(&A::test)(a);
27std::mem_fun_ref,mem_fun1_ref分析    int n2 = std::mem_fun1_ref(&A::add)(a,100);
28std::mem_fun_ref,mem_fun1_ref分析    
29std::mem_fun_ref,mem_fun1_ref分析    printf("%d\n", n);    //10
30std::mem_fun_ref,mem_fun1_ref分析    printf("%d\n", n2);    //110
31std::mem_fun_ref,mem_fun1_ref分析}


分析

接着看看functional的源代码,分析是怎么实现的执行std::mem_fun_ref(&A::test)(a)时,首先执行这个函数

23std::mem_fun_ref,mem_fun1_ref分析template<class _Result,
24std::mem_fun_ref,mem_fun1_ref分析    class _Ty> inline
25std::mem_fun_ref,mem_fun1_ref分析    mem_fun_ref_t<_Result, _Ty> mem_fun_ref(_Result (_Ty::*_Pm)())
26std::mem_fun_ref,mem_fun1_ref分析std::mem_fun_ref,mem_fun1_ref分析    std::mem_fun_ref,mem_fun1_ref分析{    // return a mem_fun_ref_t functor adapter
27std::mem_fun_ref,mem_fun1_ref分析    return (std::mem_fun_ref_t<_Result, _Ty>(_Pm));
28std::mem_fun_ref,mem_fun1_ref分析    }

会将函数的_Result_Ty_Pm分别模板展开为int, A, test,从而返回一个

mem_fun_ref_t<_Result=int, _Ty=A>(_Pm=test)的对象,而该对象初始化函数代码如下

template<class _Result,
 3std::mem_fun_ref,mem_fun1_ref分析    class _Ty>
 4std::mem_fun_ref,mem_fun1_ref分析    class mem_fun_ref_t
 5std::mem_fun_ref,mem_fun1_ref分析        : public unary_function<_Ty, _Result>
 6std::mem_fun_ref,mem_fun1_ref分析std::mem_fun_ref,mem_fun1_ref分析    std::mem_fun_ref,mem_fun1_ref分析{    // functor adapter (*left.*pfunc)(), non-const *pfunc
 7std::mem_fun_ref,mem_fun1_ref分析public:
 8std::mem_fun_ref,mem_fun1_ref分析    explicit mem_fun_ref_t(_Result (_Ty::*_Pm)())
 9std::mem_fun_ref,mem_fun1_ref分析        : _Pmemfun(_Pm)
10std::mem_fun_ref,mem_fun1_ref分析std::mem_fun_ref,mem_fun1_ref分析        std::mem_fun_ref,mem_fun1_ref分析{    // construct from pointer
11std::mem_fun_ref,mem_fun1_ref分析        }
12std::mem_fun_ref,mem_fun1_ref分析
18std::mem_fun_ref,mem_fun1_ref分析private:
19std::mem_fun_ref,mem_fun1_ref分析    _Result (_Ty::*_Pmemfun)();    // the member function pointer
20std::mem_fun_ref,mem_fun1_ref分析    };

在初始化函数中将成员变量_Pmemfun展开为

int (A::* _Pmemfun)()

并初始化为_Pmemfun = &test

std::mem_fun_ref(&A::test)(a)会执行operator (A & _left)操作

 4std::mem_fun_ref,mem_fun1_ref分析    class mem_fun_ref_t

       。。。。。

13std::mem_fun_ref,mem_fun1_ref分析    _Result operator()(_Ty& _Left) const
14std::mem_fun_ref,mem_fun1_ref分析std::mem_fun_ref,mem_fun1_ref分析        std::mem_fun_ref,mem_fun1_ref分析{    // call function
15std::mem_fun_ref,mem_fun1_ref分析        return ((_Left.*_Pmemfun)());
16std::mem_fun_ref,mem_fun1_ref分析        }

,实际上是执行了 _left->_Pmemfun()函数

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-18
  • 2021-07-07
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-08-25
  • 2022-12-23
  • 2022-12-23
  • 2021-12-22
  • 2022-12-23
  • 2021-12-30
  • 2022-02-27
相关资源
相似解决方案