了解使用ptr_fun、mem_fun和mem_fun_ref的原因3(Effective stl 条款41)

 
ptr_fun () 函数比前面两个函数就要简单多了,这个函数只是将一个一般形式调用的函数 ( 语法 #1 调用 ) 包装成为一个可被适配的函数。还记得在条款 40 中,我们知道一个可适配的仿函数类必须从 unary_function binary_function 继承。 ptr_fun 的功能就是包装一个一般意义的函数,生成一个可适配的仿函数对象。
 
// TEMPLATE FUNCTION ptr_fun
template <class _Arg,class _Result> inline
    pointer_to_unary_function<_Arg, _Result, _Result (__cdecl *)(_Arg)>// 返回类型
    ptr_fun(_Result (__cdecl *_Left)(_Arg))
    
{   // return pointer_to_unary_function functor adapter
     
return (std::pointer_to_unary_function<_Arg, _Result, _Result (__cdecl *)(_Arg)>(_Left));
     
}
 
  
 
pointer_to_unary_function 类:
// TEMPLATE CLASS pointer_to_unary_function
template <class _Arg,class _Result,class _Fn = _Result (*)(_Arg)>
    
class pointer_to_unary_function:                   // 仿函数类的定义,继承自 unary_function
                                           public unary_function<_Arg, _Result>
       
{   // functor adapter (*pfunc)(left)
        
public :
    explicit pointer_to_unary_function(_Fn _Left): _Pfun(_Left)
    {   // construct from pointer
    }
           
    _Result operator()(_Arg _Left) const
    {   // call function with operand
        return (_Pfun(_Left));// 转换成实际的调用
    }
        
protected :
    _Fn _Pfun// the function pointer
};
   
not1 (test);// 错误, not1 需要一个可适配的函数参数,而 test 不是
not1 (ptr_fun(test));//OK test 函数用 ptr_fun 包装返回可适配的仿函数类满足 not1 要求
 
 
总结:
ptr_fun 函数只是简单的对实际函数进行包装,其真实目的只是定义适配器需要的 typedef , 一个 ptr_fun 有关的可选策略是只有当你被迫时才使用它。如果当 typedef 是必要时你忽略了它,你的编译器将退回你的代码。然后你得返回去添加它。
  
mem_fun mem_fun_ref 的情况则完全不同。只要你传一个成员函数给 STL 组件,你就必须使用它们,因为, 除了增加 typedef (可能是或可能不是必须的)之外,它们把调用语法从一个通常用于成员函数的适配到在 STL 中到处使用的。当传递成员函数指针时如果你不使用它们,你的代码将永远不能编译。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值