博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++中巧用函数对象传递附加信息
阅读量:7118 次
发布时间:2019-06-28

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

定义了调用操作符的类,其对象常称为函数对象,即它们是行为类似函数的对象。可以为类类型的对象重载函数调用操作符。一般为表示操作的类重载调用操作符。函数调用操作符必须声明为成员函数。一个类可以定义函数调用操作符的多个版本,由形参的数目或类型加以区别。

例如,可以定义名为 absInt 的结构,该结构封装将 int 类型的值转换为绝对值的操作:

class absInt{public:    int operator() (int val)     {         return val < 0 ? -val : val;     }};

貌似什么的例子没什么吸引力, 下面来个例子.

比如我们有个存储字符串的vector<string> words; 我们想计算其中字符数大于6的个数, 我们现在使用标准库的函数count_if来计算. count_if最后传入处理函数,函数形式like this:

bool funcName(const string &s) ;

此函数只接受一个参数,并且是count_if来为你传入, 好,下面我们写个比较函数:

// determine whether a length of a given word is 6 or more  bool GT6(const string &s)  {      return s.size() >= 6;  }

这样来调用就ok了

vector
::size_type wc = count_if(words.begin(), words.end(), GT6);

很明显这样有一个最大的缺点就是,6是硬编码, 如果我要大于7的个数呢? 在写一个? 那大于8的呢?..............

有的家伙说: 日, 把6定义成一个变量就好了. 那是可以,但是太不优雅了(装一次逼). 况且如果需要的不是这种简单的大于6个数的需求呢?

有的家伙说: 靠你媳妇不戴套, 直接写比这简单啊!  我太阳,也是哈, 但是如果是一个比较复杂的算法,别人就提供了这样的接口呢?

......

好了,那就函数对象呗, 不然不跑题了, 日.

// determine whether a length of a given word is longer than a stored bound class GT_cls { public:     GT_cls(size_t val = 0): bound(val) { }     bool operator()(const string &s){ return s.size() >= bound; } private:     std::string::size_type bound; };

调用方式:

//大于6个cout << count_if(words.begin(), words.end(), GT_cls(6)) << " words 6 characters or longer" << endl;//大于5个cout << count_if(words.begin(), words.end(), GT_cls(5)) << " words 5 characters or longer" << endl;//循环体for (size_t i = 0; i != 11; ++i)     cout << count_if(words.begin(), words.end(), GT(i))<< " words " << i << " characters or longer" << endl;

 

 

转载于:https://www.cnblogs.com/likebeta/archive/2012/08/03/2621812.html

你可能感兴趣的文章
php_screw
查看>>
CentOS 6.2目录服务之LDAP(一)
查看>>
可替代的C语言开发环境
查看>>
从源码分析常见的基于Array的数据结构动态扩容机制
查看>>
前几天入手一大菠萝,写个初始化教程
查看>>
SoapUI Pro Project Solution Collection-DataSource(jdbc,excel)
查看>>
浅谈嵌入式软件的未来发展
查看>>
Dockerfile最佳实践(二)
查看>>
数学之美:两点之间最快的路径
查看>>
Ansible 详细用法部署安装
查看>>
CPU
查看>>
Spark的这些事&lt;二&gt;——几个概念
查看>>
Retrofit2.0使用
查看>>
网络01:双无线路由器无缝对接设置
查看>>
实现Android和PC之间的蓝牙通信
查看>>
rails将类常量重构到数据库对应的表中之二
查看>>
微软面试题:写程序找出二叉树的深度
查看>>
[Google Guava] 1.2-前置条件
查看>>
OEA框架 2.9 Pre-Alpha 源码公布
查看>>
我的MYSQL学习心得(十三) 权限管理
查看>>