bool (*pf)(const string &s1,const string &s2);//pf指向一个函数,该函数返回值是bool类型,形参是两个const string类型的引用
//以上是声明,未初始化
//一定要写括号!!!不写含义就变成声明一个叫pf的函数,返回值是bool*类型
pf=lengthCompare;//赋值
包含显式初始化的声明即定义。
把函数名作为一个值使用时,该函数自动转为指针
pf=lengthCompare;//pf指向名为lengthCompare的函数
pf=&lengthCompare;//和上面语句等价
使用指针就相当于使用函数,无需使用*
bool b1=pf("hello","goodbye");
bool b2=(*pf)("hello","goodbye");
bool b3=lengthCompare("hello","goodbye");
//三者都是对的等价
pf不能指向不匹配的函数,但是可以指向0或nullptr,表示该指针没有指向任何一个函数
pf=0;//正确
void ff(int *);
void ff(unsigned int);//两个重载函数
void(*pf1)(unsigned int)==ff;//!!!根据形参最佳匹配,匹配到第二行的ff
必须精确匹配,有匹配不上的就无法匹配,编译器报错
形参看起来是函数类型,实际上却是当成指针来用,自动转换成指向函数的指针
void useBigger(const string&s1,const string& s2,bool pf(const string &,const string &));//第三个参数自动转换为函数指针
void useBigger(const string&s1,const string& s2,bool (*pf)(const string &,const string &));//显式地将形参定义成函数指针
调用时直接传递函数,把函数作为实参即可
useBigger(s1,s2,lengthCompare);
可用类型别名和decltype简化代码
//简化函数类型
typedef bool Func(const string &s1,const string &s2);
typedef decltype(lengthCompare) Func2;
//简化函数指针类型
typedef bool(*FuncP)(const string &s1,const string &s2);
typedef decltype(lengthCompare) *FuncP2;//!!!decltype推测函数类型,不会自己转换为函数指针,要加上*
简化后调用
void useBigger(const string&s1,const string& s2,Func);//自动转换为函数指针Func是简化的函数类型
void useBigger(const string&s1,const string& s2,FuncP2);//函数指针类型显式
使用类型别名返回函数指针
using F=int(int *,int);//F是函数类型
using PF=int(*)(int *,int);//PF是函数指针类型
PF f1(int);//f1返回函数类型
F f1(int);//错误,不能返回函数类型
F* f1(int);//正确,显式地指定返回类型是函数指针
直接声明返回类型
int (*f1(int))(int *,int);
尾置返回类型
auto f1(int)->int(*)(int *,int);
要注意decltype不会自动转换为指针,需要我们显式加上*
6.56
#include<iostream>
#include<vector>
using namespace std;
int f1(int a,int b)
{
return a+b;
}
int f2(int a,int b)
{
return a-b;
}
int f3(int a,int b)
{
return a*b;
}
int f4(int a,int b)
{
return a/b;
}
int f(int,int);
int main()
{
vector<decltype(f)*> v;
//vector<int(*)(int,int)>v; 这种写法也对,但没有用decltype更好理解
v={f1,f2,f3,f4};
for(auto fp:v)
{
cout<<fp(20,5)<<endl;
}
}