定义了调用操作符的类,其对象常称为函数对象,即它们是行为类似函数的对象。可以为类类型的对象重载函数调用操作符。一般为表示操作的类重载调用操作符。函数调用操作符必须声明为成员函数。一个类可以定义函数调用操作符的多个版本,由形参的数目或类型加以区别。
例如,可以定义名为 absInt 的结构,该结构封装将 int 类型的值转换为绝对值的操作:
class absInt
{
public:
int operator() (int val)
{
return val < 0 ? -val : val;
}
};
貌似什么的例子没什么吸引力, 下面来个例子.
比如我们有个存储字符串的vector
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<string>::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
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/57741
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!