函数子可匹接

函数子可匹接:

经常我们会同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

posted @ 2017-03-20 19:01  Przz  阅读(187)  评论(0编辑  收藏  举报