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

    1、考虑下面的需求,在一个int的vector中,找出一个比5的元素,容易想到的解决办法,定义一个方法对象,使用模板,如下:
    vector<int>::iterator iter = find_if(intVec.begin(),intVec.end(),Finder<int>(3));

    2、分析
    find_if的伪代码如下:
    for (; _First != _Last; ++_First)
    {
    if (_Pred(*_First))
    {
    return _First;
    }
    }
    return _Last;
    也就是说,第三个参数只要能够执行 _Pred(*_First) 就可以,也就是具备隐式接口_Pred(*_First)。
    方法对象Finder<int>(3) 满足条件。
    3、有没有其他的办法呢?
    我们已经有了方法对象greater 用于比较两个对象的大小,以及参照物,能不能使用greater呢?
    这里存在问题:greater接收两个参数比较大小,而find_if的第三个参数具备隐式接口_Pred(*_First),只接受一个参数。
    这就需要解决,greater接受两个参数,把其中一个参数(参照物)固定下来,转化为只接受一个参数的方法。这就是方法适配器。
    也就是说,对greater和已知的参照物提供一层封装,对外只接受一个参数,对内转交给greater,来比较变量和参照物的大小。
    4、代码如下:
    vector<int>::iterator iter = find_if(intVec.begin(),intVec.end(),bind2nd(greater<int>(),3));
    greater<int>() 是匿名的方法对象,bind2nd(greater<int>(),3) 对匿名的方法对象和参照物进行封装,产生一个新的方法对象,对外接受一个参数,对内转交给greater,比较参数和参照物的大小。
    5、注意:适配器模式与代理模式的区别,适配器模式是客户要求接口A,已存在的组件可以完成功能,但是没有接口A,提供适配器对组件封装,对外暴露接口A,对内转交给组件处理。对组件封装,有两种方式:private继承(实现继承)和关联。private继承叫做类适配器,关联叫做对象适配器模式。而代理模式是proxy和subject具备同样的接口,proxy关联subject,做的事情都转交给subject。

  • 相关阅读:
    log4net Config Examples
    求解:Nhibernate Unknown entity class 的解决办法
    复制Oracle表的结构
    Linux下安装MySQL并为其创建新用户图解教程
    windows下使用ffmpeg进行视频转码,图片拉取的Java测试代码
    Linux下安装Nginx详细图解教程
    Linux下安装Memcached图解教程
    Linux下使用Yum安装ffmpeg
    图解Java中如何将Jar文件打包成exe文件
    Java中实现系统托盘功能(代码全贴,附加运行截图)
  • 原文地址:https://www.cnblogs.com/nzbbody/p/4621789.html
Copyright © 2011-2022 走看看