C++基础3:仿函数

系列文章目录

C++基础:开篇
C++基础1:从const关键字看变量的基础单元-类
C++基础2:构造函数、拷贝构造、赋值运算符重载



前言

C++的仿函数技术是基于C++的运算符重载实现的,这项技术广泛应用于STL(标准模板库)中,本篇来讲解一下该技术。


一、什么是仿函数?

简单来说,仿函数就是让一个类用起来像函数。我们都知道函数的调用格式是“函数名+()”,括号里面是形参列表。该格式典型的特征是用"()"去调用函数。那么如何才能让一个类,也具备这样的特征呢?这就需要用到C++的运算符重载技术。下面我们看实例代码。

二、实现步骤

1.定义类

class opt_add
{
public:
	opt_add()
	{
	}
};

2.重载()运算符

class opt_add
{
public:
	opt_add()
	{
	}
	
	int operator()(int a,int b)
	{
		return a+b;
	}
};

3.使用仿函数

#include <iostream>
#using namespace std;
void main()
{
	opt_add myAdd;
	int a = 1;
	int b = 2;
	
	cout << "a+b=" << myAdd(a,b) << endl;
}

输出结果如下:

a+b=3

如以上代码所示,我们可以像使用函数一样,使用类。

此处再做一下扩展,可以把仿函数做成模板类,这样就可以对任意任意类型进行仿函数操作。

4.仿函数结合模板

template <typename T>
class opt_add
{
public:
	opt_add()
	{
	}

	T operator()(T a, T b)
	{
		return a + b;
	}
};

void main()
{
	opt_add<int> myAdd;
	int a = 1;
	int b = 2;
	
	cout << "a+b=" << myAdd(a,b) << endl;
}

由于类模板没办法做类型推断,我们在定义类时,需要明确指明类型。像这样

opt_add<int> myAdd;

我们知道函数模板可以做类型推断。我们可以使用函数模板来简化仿函数的使用。

5.用函数模板简化仿函数调用

我们需要一个辅助函数,如下:

template<typename T>
T call_opt_add(T a, T b)
{
	opt_add<T> opt;

	return opt(a, b);
}

使用辅助函数调用仿函数:

#include <iostream>
#using namespace std;
void main()
{
	int a = 1;
	int b = 2;

	double c = 3.3;
	double d = 1.5;
	
	cout << "a+b=" << call_opt_add(a,b) << endl;
	cout << "c+d=" << call_opt_add(c,d) << endl;
}

运行结果如下:

a+b=3
c+d=4.8

总结

仿函数是STL的六大部件之一,与之相关的还有仿函数适配器。关于仿函数适配器,我们后续会单独出一篇文章。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值