函数对象
定义:函数对象本质还是个对象,它实现了operator()运算符的重载,在调用者使用起来和函数一样,别名又叫仿函数。
优点
1、通过函数对象调用operator()在编译阶段可以转成内联函数,直接展开,减少函数堆栈调用开销,而函数指针不可以,因为编译阶段只能看到指针的地址;
2、可以在对象内添加自己需要的定制信息,比如调用次数;
#include<iostream>
#include<vector>
#include <algorithm>
#include <functional>
using namespace std;
//C语言函数指针
template<typename T>
bool comapre(T a, T b)
{
return a>b;
}
template<typename T>
bool mygreater(T a, T b)
{
return a>b;
}
template<typename T>
bool myless(T a, T b)
{
return a<b;
}
template<typename T , typename Compare>
bool comapre(T a, T b , Compare comp)
{
return comp(a , b);
}
//
//函数对象MyGreater
template<typename T>
class MyGreater
{
public:
bool operator()(T a , T b)
{
return a>b;
}
};
//函数对象Myless
template<typename T>
class Myless
{
public:
bool operator()(T a , T b)
{
return a<b;
}
};
int main()
{
//C语言函数指针
cout<<comapre(10,20 , mygreater<int>)<<endl;;
cout<<comapre(10,20 , myless<int>)<<endl;
cout<<"------------------"<<endl;
//函数对象
cout<<MyGreater<int>()(10,20)<<endl;
cout<<Myless<int>()(10,20)<<endl;
cout<<"------------------"<<endl;
cout<<comapre(10,20 , MyGreater<int>())<<endl;;
cout<<comapre(10,20 , Myless<int>())<<endl;
return 0;
}