函数对象:
如果一个类将()运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象。
函数对象是一个对象,但是使用的形式看起来像函数调用,实际上也执行了函数调用,因而得名。
一个函数对象类可以多次重载(),根据不同的传参可以调用不同的函数,下面代码演示了函数对象的集中使用方法:
- 根据传参类型不同调用不同的函数对象函数。
- 函数对象多为参数传入函数。
#include <iostream>
#include <vector>
#include <functional> //函数对象头文件
using namespace std;
//定义一个函数对象类
class function_obj
{
public:
//()运算符重载,实现函数对象
int operator()(int a,int b)
{
cout<<"调用函数对象1"<<endl;
return a+b;
}
//()运算符重载,实现函数对象,返回的是一个pair{vector,bool}
std::pair<std::vector<double>,bool> operator()(std::vector<double> &vec1,bool flag = false)
{
cout<<"调用函数对象2"<<endl;
vec1.at(1)+=0.123;
return {vec1,flag};
}
};
//定义一个函数类型,与function_obj的第二个函数类型相符,方便后面函数对象作为参数传入
using function_type = std::function<std::pair<std::vector<double>,bool>(std::vector<double>&,bool)>;
void control(function_type func)
{
std::vector<double> vec1 = {1,2,3,4,5};
bool flag = true;
std::pair<std::vector<double>,bool> ret({}, false);
ret = func(vec1,flag); //调用传入的函数对象
for(auto p:ret.first)
{
cout<<p<<" ";
}
cout<<endl<<ret.second<<endl;
}
int main(void)
{
function_obj obj; //定义函数对象obj
obj(1,2); //根据传入的参数选择匹配第一个重载函数
std::vector<double> vec1 = {1,2,3,4,5};
obj(vec1,true); //根据传入的参数选择匹配第二个重载函数
control(obj); //函数对象obj作为函数参数形参传入,自动匹配第二个重载函数
}
输出结果:
调用函数对象1
调用函数对象2
调用函数对象2
1 2.123 3 4 5
1
可以看出,obj(1,2);根据传入的参数自动匹配函数对象类中的第二个()重载函数,obj(vec1,true);根据传入的参数选择匹配第二个重载函数,control(obj);将函数对象obj作为参数传入调用,注意obj的函数类中对()的重载函数类型需要有与control()传参的函数类型相匹配。