指向函数的指针、指向成员函数的指针,指向类中操作符的指针,仿函数作为参数的原理

本文详细探讨了C++中模板函数与仿函数的实现方式与应用实例,包括普通回调函数、具有()操作符的类以及类成员函数指针的使用,通过实例展示了如何在`sort()`函数中灵活运用这些概念进行数据排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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内部不管是针对回调函数还是仿函数,都是统一看成一种型别,回调函数是一个指针,而仿函数则认为是一个对象,并且这个对象一定要重载()操作符,

   //不然当sort内部调用my2(a,b)时就不会成功;而回调函数就简单了 直接就是pCallBack(a,b);


//注意:此代码在VS2010下运行;  classFuction(a,b)  <===> classFuction.operator()(a,b);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值