1.仿函数:又叫std::function,是C++中的一个模板类
2.C语言中的函数指针:
int add(int a,int b)
{
return a+b;
}
typedef int (*func)(int,int);//给函数类型定义别名
func func1;
func1=add;//给函数指针初始化
或者int (*func1)(int,int)=add;
函数指针的好处:
假设有10个函数:add,sub,mul,div,...如果采用普通的switch() case:
switch(status)
{
case 0:add(2,3);break;
case 1:sub(2,3);break;
case 1:sub(2,3);break;
case 1:sub(2,3);break;
...
}
//缺点,如果函数过多,假设有100个case,那么调用某个case的效率会很低,因为case是从第一个case逐一比较,知道匹配为止,因此必须尽量把调用概率高的case放在最前面,以减少匹配比较的次数
如果采用函数指针来实现:
typedef int (*pFunc)(int,int);
pFunc func[10]={add,sub,mul,div,...};
func[status](2,3);//直接调用某个指定的函数,效率很高,而且每个函数的效率与访问的概率和匹配比较的次数无关
总结:采用函数指针是动态绑定,而采用switch case哪种类型的是静态绑定,即编译时就决定了调用哪个函数,而不是等到运行时才决定
3.C++中把函数指针封装成了一个类,这也正是C++中无处不类的思想的体现,即std::function,还是个模板类
需要包含的头文件:
#include
using namespace std;
std::function
int res=func(3,4);//仿函数调用
cout< 4.仿函数在C++类成员函数中的使用便利之处 传统的类成员函数指针的使用方法: class test{ public: int add(int a,int b) { return a+b; } } typedef int (*PFUNC)(int ,int);//使用类型别名的成员函数指针 PFUNC pfunc; test::pfunc=test::add 5.传统的成员函数指针的用法: int( test::*pfunc)(int ,int)=&test::add; //类成员函数指针的定义 调用: (this->*)pfunc(3,4);//太复杂了 6.bind的功能:把一个具体函数,变成std::function对象 void func(int a,char b,float c) {