zoukankan      html  css  js  c++  java
  • 函数子可匹接

    函数子可匹接:

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

  • 相关阅读:
    java实现人民币金额大写
    java实现人民币金额大写
    java实现取球博弈
    java实现取球博弈
    java实现取球博弈
    java实现取球博弈
    java实现取球博弈
    java实现平面4点最小距离
    windows下进程间通信的(13种方法)
    利用消息机制实现VC与Delphi之间的通讯(发送自定义消息)
  • 原文地址:https://www.cnblogs.com/Przz/p/6591053.html
Copyright © 2011-2022 走看看