#include <vector>
#include <algorithm> // Include algorithms
#include <iostream>
using namespace std;
//普通回调函数
bool Compare(int s1, int s2)
{
return s1>s2;
}
typedef bool (*pFuc)(int s1,int s2);
//具有()操作符的类---仿函数
typedef struct classFuction
{
bool operator () (int s1,int s2)
{
return s1>s2;
}
bool testCompare(int s1,int s2)
{
return s1>s2;
}
classFuction()
{
}
classFuction(int a)
{
this->a=a;
}
private:
int a;
}classFuction;
typedef bool (classFuction::* pmf) (int s1,int s2); //指向类成员函数指针,可以指向普通成员函数(包括操作符函数)
//TestPFuction
void TestFuc(pFuc fuc1,int a,int b)//要求输入一个函数指针
{
bool m_bool=fuc1(a,b);
}
int main(int argc, char* argv[])
{
//普通回调函数
int a=3,b=4;
TestFuc(Compare,a,b);
//Test类
pmf mypmf1=&classFuction::operator();//指向操作符函数指针
pmf mypmf2=&classFuction::testCompare;//指向成员函数指针
classFuction myclassFuc;//必须有一个实体才能调用
(myclassFuc.*mypmf1)(a,b);//调用myclassFuc.operator()(a,b);
(myclassFuc.*mypmf2)(a,b);//调用myclassFuc.TestCompare(a,b);
//TestFuc(mypmf1,a,b);//这样肯定不会成功,因为成员函数默认有一个this指针
vector<int> vec;
for(int i=0;i<5;i++)
{
vec.push_back(i);
}
classFuction my=classFuction();
sort(vec.begin(),vec.end(),my);//等价于sort<vector<int>::iterator,classFuction>(vec.begin(),vec.end(),my);,因为自变量推导,my会被推倒为classFuction
sort<vector<int>::iterator,classFuction >(vec.begin(),vec.end(),my);//等同于上面
sort<vector<int>::iterator,classFuction >(vec.begin(),vec.end(),classFuction());//传入一个临时对象 classFuction()默认构造函数
classFuction my2=classFuction(2);
sort<vector<int>::iterator,classFuction >(vec.begin(),vec.end(),my2);//仿函数有点之一,可以设置属性的值,
//其实在sort内部不管是针对回调函数还是仿函数,都是统一看成一种型别,回调函数是一个指针,而仿函数则认为是一个对象,并且这个对象一定要重载()操作符,
#include <algorithm> // Include algorithms
#include <iostream>
using namespace std;
//普通回调函数
bool Compare(int s1, int s2)
{
return s1>s2;
}
typedef bool (*pFuc)(int s1,int s2);
//具有()操作符的类---仿函数
typedef struct classFuction
{
bool operator () (int s1,int s2)
{
return s1>s2;
}
bool testCompare(int s1,int s2)
{
return s1>s2;
}
classFuction()
{
}
classFuction(int a)
{
this->a=a;
}
private:
int a;
}classFuction;
typedef bool (classFuction::* pmf) (int s1,int s2); //指向类成员函数指针,可以指向普通成员函数(包括操作符函数)
//TestPFuction
void TestFuc(pFuc fuc1,int a,int b)//要求输入一个函数指针
{
bool m_bool=fuc1(a,b);
}
int main(int argc, char* argv[])
{
//普通回调函数
int a=3,b=4;
TestFuc(Compare,a,b);
//Test类
pmf mypmf1=&classFuction::operator();//指向操作符函数指针
pmf mypmf2=&classFuction::testCompare;//指向成员函数指针
classFuction myclassFuc;//必须有一个实体才能调用
(myclassFuc.*mypmf1)(a,b);//调用myclassFuc.operator()(a,b);
(myclassFuc.*mypmf2)(a,b);//调用myclassFuc.TestCompare(a,b);
//TestFuc(mypmf1,a,b);//这样肯定不会成功,因为成员函数默认有一个this指针
vector<int> vec;
for(int i=0;i<5;i++)
{
vec.push_back(i);
}
classFuction my=classFuction();
sort(vec.begin(),vec.end(),my);//等价于sort<vector<int>::iterator,classFuction>(vec.begin(),vec.end(),my);,因为自变量推导,my会被推倒为classFuction
sort<vector<int>::iterator,classFuction >(vec.begin(),vec.end(),my);//等同于上面
sort<vector<int>::iterator,classFuction >(vec.begin(),vec.end(),classFuction());//传入一个临时对象 classFuction()默认构造函数
classFuction my2=classFuction(2);
sort<vector<int>::iterator,classFuction >(vec.begin(),vec.end(),my2);//仿函数有点之一,可以设置属性的值,
//其实在sort内部不管是针对回调函数还是仿函数,都是统一看成一种型别,回调函数是一个指针,而仿函数则认为是一个对象,并且这个对象一定要重载()操作符,
//不然当sort内部调用my2(a,b)时就不会成功;而回调函数就简单了 直接就是pCallBack(a,b);
//注意:此代码在VS2010下运行; classFuction(a,b) <===> classFuction.operator()(a,b);
}