指向函数的指针

在函数中,形参不能为函数类型,但可以是指向函数的指针,此时,形参看起来是函数类 型,实际上当作指针使用。

//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)();
}

运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值