函数子可匹接

函数子可匹接:

经常我们会同not1对函数返回进行转义:

bool isInteresting(const node* p);
find_if(c.begin(),c.end(),not1(isInteresting));

但实际上isInteresting作为一个基本的函数指针,缺少not1所需要的函数定义。


unary_function和binary_function:

比较简便的方法就是从STL中继承上面这两个基类。所以函数子经常会出现下面这种代码

class MeetsThread : public std::unary_function<Widget , bool>{}

继承模板中的参数,就是operator()操作的输入和返回。


ptr_fun、mem_fun、mem_fun_ref:

就像for_each函数,是通过传递函数对象,然后让其调用容器中元素。
对于成员函数等就需要一些特殊的处理。

f(x);     //语法1
x.f();    //语法2
p->f();   //语法3

mem_fun:

list<node *> it;
for_each( it.begin() ,it.end() ,mem_fun(&node::test)) ;

可以读入一个成员函数的指针,然后返回一个mem_fun_t对象.

  • mem_fun_t:一个函数子类,拥有该成员函数的指针,并提供了operator(),将语法3变成语法1调用

mem_fun_ref:

mem_fun_ref函数与mem_fun函数很像,只是会将语法2变成语法1


ptr_fun/bind1st/bin2nd:

ptr_fun是将一个普通的函数适配成一个functor
bind1st和bind2nd函数把一个二元函数对象绑定成为一个一元函数对象。
bind1st是绑定第一个参数,bind2nd则是绑定第二个参数。

int sum(int arg1, int arg2)  
{  
    cout<<"ARG 1: "<<arg1<<endl;  
    cout<<"ARG 2: "<<arg2<<endl;  
  
    int sum = arg1 + arg2;  
    cout<<"SUM: "<<sum<<endl;  
  
    return sum;  
}  
  
int main(int argc,char* argv[])  
{  
    bind1st(ptr_fun(sum),1)(2);   // the same as sum(1,2) ,在第一个参数绑定1
    bind2nd(ptr_fun(sum),1)(2);   //the same as sum(2,1)  ,在第二个参数绑定1
  
    getchar();  
    return 0;  
}  

参考:

Effective STL

转载于:https://www.cnblogs.com/Przz/p/6591053.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值