zoukankan      html  css  js  c++  java
  • 函数配接器

    函数配接器

    bind1st(op,value) ----> op(value,param)     //绑定op的第一个参数

    bind2st(op,value) ----> op(param,value)

    not1(op) ---->!op(param)

    not2(op) ---->!op(param1,param2)

    注:其中的bind相关参考boost库中bind内容

    int func1(int p1,int p2 ){
        
        cout<<"p1 = "<<p1<<endl;
        cout<<"p2 = "<<p2<<endl;
        cout<<"result = "<<p1+p2<<endl;
    
        return p1+p2;
    }
    
    int main(int argc, char* argv[])
    {
        bind1st(ptr_fun(func1),2)(3);
        return 0;
    }

    这是一个使用示例,看到其中有个ptr_fun,这是干嘛的呢?

    ptr_fun即是针对一般函数设计的函数配接器;

    另有

    mem_fun_ref(op)   :针对某对象的一个const成员函数

    mem_fun(op)  :针对某函数指针的一个const成员函数

      //在vs2012上编译通过,vc6.0编译失败

    #include "stdafx.h"
    #include <vector>
    #include <iostream>
    #include <algorithm>
    #include <functional>
    
    using namespace std;
    
    
    int func1(int p1,int p2 ){
    
        cout<<"p1 = "<<p1<<endl;
        cout<<"p2 = "<<p2<<endl;
        cout<<"result = "<<p1+p2<<endl;
    
        return p1+p2;
    }
    
    class Myclass{
    public:
        int func1( ){
            cout<<"func1 no param"<<endl;        
            return 0;
        }
    
        int func2(int i){
            cout<<"func2 param = "<<i<<endl; 
            return 0;
        }
    };
    
    int main(int argc, char* argv[])
    {
        cout<<"测试普通函数配接器"<<endl;
        bind1st(ptr_fun(func1),2)(3);
    
        vector<Myclass> ovec;
        Myclass o1 = Myclass(); ovec.push_back(o1);
        Myclass o2 = Myclass(); ovec.push_back(o2);
        Myclass o3 = Myclass(); ovec.push_back(o3);
        cout<<"测试成员函数配接器(不带参数)"<<endl;
        for_each(ovec.begin(),ovec.end(),mem_fun_ref(&Myclass::func1));
        cout<<"测试成员函数配接器(带参数)"<<endl;
        for_each(ovec.begin(),ovec.end(),bind2nd(mem_fun_ref(&Myclass::func2),2));
    
        vector<Myclass * > pvec;
        Myclass *po1 =new Myclass(); pvec.push_back(po1);
        Myclass *po2 =new Myclass(); pvec.push_back(po2);
        Myclass *po3 =new Myclass(); pvec.push_back(po3);
        cout<<"测试对象指针成员函数配接器(不带参数)"<<endl;
        for_each(pvec.begin(),pvec.end(),mem_fun(&Myclass::func1));
        cout<<"测试对象指针成员函数配接器(带参数)"<<endl;
        for_each(pvec.begin(),pvec.end(),bind2nd(mem_fun(&Myclass::func2),2));
    
        getchar();
        return 0;
    }

      注意点: 在带一个参数的成员函数绑定时用的是bind2nd,查过资料后知道了原因:第一个参数就相当于this指针了,绑定第二个参数就是绑定成员函数第一个参数

  • 相关阅读:
    ibatis项目启动报错The string "--" is not permitted within comments【原】
    excel vlookup简易样例【原】
    用itext合并多个pdf文件【转】【补】
    springboot 自定义starter之AutoConfiguration【原】
    springboot 启动配置原理【转】【补】
    springboot 数据访问【转】【补】
    springboot thymeleaf【转】【补】
    包名的命名方式
    servlet中doget和dopost方法的区别
    DBUtils使用详细示例
  • 原文地址:https://www.cnblogs.com/xiumukediao/p/4658985.html
Copyright © 2011-2022 走看看