在函数中,形参不能为函数类型,但可以是指向函数的指针,此时,形参看起来是函数类 型,实际上当作指针使用。
//ptr为指向函数的指针
//第三个形参是函数类型,会自动转换成函数的指针
void f(const string &s1,const string &s2,bool ptr(int a,int b) );
//第三个形参是函数指针
void f(const string &s1,const string &s2,bool (*ptr)(int a,int b) );
可以直接把函数当作实参使用,此时它会自动转换为指针:
//自动将函数fun转换为指向该函数的指针
f(s1,s2,fun)
函数不能返回函数类型,但是可以返回指向函数的指针,必须把返回类型写成指针形式。
using F = int(int*,int); //F是函数类型,不是指针类型
using PF = int(*)int(int*,int); //PF是指针类型
PF f1(int); //正确,f1返回函数的指针
F f1(int); //错误,f1不能返回函数类型
F *f1(int); //正确,显示地指定f1返回一个函数的指针
也可以直接声明f1:
int (*f1(int))(int*,int);
可以由内而外解读f1:f1带形参,说明它是函数;f1前面有*,说明返回一个指针;指针类型也有形参,说明f1返回一个函数的指针,这个函数返回int类型。
还可以用尾置返回类型的方式声明f1:
auto f1(int) -> int(*)(int*,int);
当知道返回的函数是哪一个,可以用decltype()来简化书写,如:
#include<iostream>
using namespace std;
int f1()
{
return 1;
}
int f2()
{
return 2;
}
decltype(f1) *f3(int i) //decltype(f1)得到的是函数类型
{
if (i==1)
return f1;
else
return f2;
}
int main()
{
cout<<f3(1)()<<endl; //f3(1)得到指向函数f1的指针,指向函数的指针不需要解引用
cout<<f3(2)();
}