博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 函数适配器
阅读量:6207 次
发布时间:2019-06-21

本文共 1015 字,大约阅读时间需要 3 分钟。

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。

转载地址:http://uszja.baihongyu.com/

你可能感兴趣的文章
问题总结
查看>>
聊聊前端国际化文案该如何处理
查看>>
Tensorflow源码解析1 -- 内核架构和源码结构
查看>>
【RPA新手教学】UiBot—巧用变量使数据搬运功能更简单更稳定
查看>>
使用 Vim 搭建 Lua 开发环境
查看>>
关于element的select多选选择器,数据回显的问题
查看>>
以太坊geth区块链私链建立
查看>>
mp3转换器如何转换音频格式   
查看>>
大话javascript 1期:作用域和作用域链
查看>>
147. Insertion Sort List
查看>>
Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
查看>>
HTTP精简教程一:Web网络基础
查看>>
手把手教你造一个基于React的markdown编辑器
查看>>
Linux快速复制或删除大量小文件
查看>>
精读《国际化布局 - Logical Properties》
查看>>
私有继承的一些作用
查看>>
容器监控实践—Metrics Server
查看>>
HDFS离线分析FsImage元数据
查看>>
PyCasbin: 支持 ACL、RBAC、ABAC 多种模型的 Python 权限管理框架
查看>>
Umi.js
查看>>