第14章 重载操作符与转换(7)

14.8 调用操作符和函数对象

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

	int i = 100;
	absInt absObj;
	cout<<absObj(i)<<endl;

函数调用操作符必须声明为成员函数。一个类可以定义为函数调用操作符的多个版本,由形参的数目或类型加以区别。

定义了调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象。

14.8.1 将函数对象用于标准库算法

函数对象经常用作通用算法的实参

1. 函数对象可以比函数更灵活

class GT_cls
{
public:
	GT_cls(size_t val=0):bound(val){}
	bool operator()(const string &s)
	{
		return s.size()>=bound;
	}
private:
	string::size_type bound;
};
2. 使用GT_cls函数对象

	GT_cls gt(6);
	cout<<gt(string("1231244"))<<endl;
14.8.2 标准库定义的函数对象

标准库还定义了一组函数适配器,使我们能够特化或者扩展标准库所定义的以及自定义的函数对象类。这些标准库函数对象类型是在functional头文件中定义的。

1.每个类表示一个给定操作符

有两个一元函数对象(unary function-object)类:一元减(negate<type>)和逻辑非(logical not<Type>)。其余的标准库函数对象都是表示二元操作符的二元函数对象(binary function-object)类。

2. 表示操作数类型的模板类型

	plus<int> intadd;
	cout<<intadd(1,2)<<endl;
3. 在算法中使用标准库函数对象

	vector<int> vec;
	sort(vec.begin(),vec.end(),greater<int>());
第三个实参用于传递比较元素的谓词函数。

14.8.3 函数对象的函数适配器

标准库提供ingke一组函数适配器(function ap

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值