调用操作符和函数对象

引言

什么是调用操作符和函数对象呢?就是调用操作符看起来像是调用函数,如下设计的一个类,是用来求一个整数的绝对值的,如下类

struct absInt
{
	int operator()(int a) {
		return (a < 0)? -a: a;
	}
};
如下调用

	int nVal = -1234;
	absInt abs;
	int nPosVal = abs.operator()(nVal);
	int nabsVal = abs(nVal);
这里使用的是abs(nval),看起来是不是函数的调用,而且还有形参呢,这里使用了重载操作符(),这里只有一个形参,所以默认使用abs()就是调用操作符(),而形参就是nVal,所以就看起来像函数调用。

解说

函数对象 functor,是可以实现operator ()的任何类类型。 此运算符称作”运算符应用程序运算符“。 标准模板库主要在容器和算法使用函数对象作为排序条件。函数对象提供两大优势条函数调用:

(1)函数对象可以包含状态

(2)函数对象属于类型并可用作模板参数

创建函数对象

若要创建功能对象,请创建一个类类型以及operator ()函数,例如:

class Functor
{
public:
    int operator()(int a, int b)
    {
        return a < b;
    }
};

int main()
{
    Functor f;
    int a = 5;
    int b = 7;
    int ans = f(a, b);
}

main 功能的最后一行显示如何调用函数对象,这看起来像是显示函数调用,但是,它实际调用Functor 中的 operator() 运算符函数。在调用函数对象和函数之间的相似之处就是对象的显示方式。

函数对象和容器

标准模板库。 <functional> 头文件包含一些函数对象。这些功能对象的一个用途是作为容器的排序依据的条件。 例如, set 容器声明如下所示:

template <class Key,class Traits=less<Key>,class Allocator=allocator<Key> >
class set
第二个模板参数是函数对象less 此函数对象返回true ,如果第一个参数传递给它比传递的第二个参数小于。 因为一些容器进行排序的元素容器,需要比较两个元素方式,这样,使用函数对象完成的。 可以通过创建函数对象拥有排序容器的条件,并指定它在模板用于容器的列表。

函数对象和算法

为函数对象的另一使用在算法。 例如, remove_if 算法声明如下所示:

template<class ForwardIterator, class Predicate>
    ForwardIterator remove_if(ForwardIterator _First, ForwardIterator _Last, Predicate _Pred);

remove_if 的最后一个参数是返回布尔值的函数对象 如果函数对象的结果是 true,则元素通过迭代器_First_Last指向的范围中移除 。你可以使用<functional> 头文件中声明的任何函数对象作为参数_Pred ,当然你也可以创建自己的函数对象。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值