将内部重载了operator()操作符的类称为仿函数(functor)又称为函数对象(function object)。是一个能行使函数功能的类,仿函数的语法几乎和我们普通的函数调用一样。
形如:return_type operator()(para_type xxx), 例如:int operator()(int num);
仿函数的出现是为了代替函数指针的,最明显的一个特点是:可以使用内联函数。而如果使用内联函数的指针,编译器会把它当普通函数对待。另外,函数对象具有类封装的特性,代码不但看起来简洁,设计也灵活,比如还可以用关联,聚合,依赖的类之间的关系,与用到他们的类组合在一起,这样有利于资源的管理。
#include <iostream>
#include <vector>
#include <algorithm>
class Functor{
public:
Functor(int number):m_number(number){};
Functor(std::string str):m_str(str){};
int operator()(int number) const {
return m_number+number;
}
std::string operator()(std::string str) const {
return m_str+" "+str;
}
private:
int m_number;
std::string m_str;
};
class Counter{
public:
Counter(int size):m_size(size){};
bool operator()(const std::string &str){
if (str.size() > m_size){
return true;
}else{
return false;
}
}
private:
int m_size;
};
bool my_function(const std::string &str){
if (str.size() > 5){
return true;
}else{
return false;
}
}
int main(){
Functor obj1(100);
Functor obj2("hello");
//将仿函数对象当做函数来使用时,会调用内部重载的operator()函数
std::cout<<obj1(33)<<std::endl;
std::cout<<obj2("world!")<<std::endl;
std::vector<std::string> name_vec{"ZhangSan", "LiSi", "GebiLaoWang"};
//count_if()为统计一定范围的某份数据满足条件的所有元素的个数,
//前两个参数为迭代器,第三个参数应是一个返回true或false 的函数对象
int ret1 = count_if(name_vec.begin(), name_vec.end(), Counter(5));//仿函数对象
int ret2 = count_if(name_vec.begin(), name_vec.end(), my_function);//普通函数指针
std::cout<<"ret1="<<ret1<<" ret2="<<ret2<<std::endl;
return 0;
}
运行结果:
仿函数对象不能直接复制给函数指针,不支持此种用法。
using func_type = std::string (*)(std::string);
type func = Functor("xxx");