系列文章目录
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的六大部件之一,与之相关的还有仿函数适配器。关于仿函数适配器,我们后续会单独出一篇文章。