C++使用switch动态获取函数(通过函数指针实现)

C语言动态函数调用 在远程调用中,服务器在收到请求后,需要通过查符号的手段,获取函数指针,然后调用客户端请求的函数。然而,不同函数参数个数、类型皆不相同,函数指针在定义时就需要明确类型,因此,没有一种定义,可以满足所有函数的调用。 阅读详情

C++使用switch动态获取函数(通过函数指针实现)

基本的就不再赘述了,以下使用三种方法完成根据不同情况动态获取函数的功能。

方法一:通过形参取地址获得函数指针

  • 这种方式的好处是可以通过传入多个取地址的形参,同时获取多个函数的指针
  • 代码如下, 输出 4,8 ,如果想一下获取多个函数的指针,根据func这个参数的写法,再加一个形参就行了
// coding:utf-8
// switch动态获取函数指针
#include<iostream>
using namespace std;
// 定义函数指针类型
typedef double (*p_func)(int);

double func1(int n){
    return n * 2;
}

double func2(int n){
    return n*4;
}

// ! 第一种获取函数指针的方式:传入形参
void getFunc1(int i, p_func& func){
    switch(i){
        case 1:{
            func = func1;
            break;
        }
        case 2:{
            // ! 因为函数名本身就是一个地址,所以取地址也没关系
            func = &func2;
            break;
        }
        default:{
            cout<<"错误"<<endl;
            exit(1);
        }
    }
}

int main(){
    // 声明函数指针
    p_func f1;
    // 获取函数
    getFunc1(1, f1);
    cout<<f1(2)<<endl;
    getFunc1(2, f1);
    cout<<f1(2)<<endl;

}

方法二:通过函数返回值返回函数指针

  • 第二种方法是通过函数的返回值,返回函数指针,然后通过强制类型转换得到函数指针
  • 这么做的好处是不需要定义函数指针类型,直接使用强制类型转换完成,对各种不同参数个数和参数类型的函数更加的友好
  • 这么做相对于第一种方式的缺点是一次只能返回一个函数
  • 代码如下, 输出 4,8
// coding:utf-8
// switch动态获取函数指针
#include<iostream>
using namespace std;

double func1(int n){
    return n * 2;
}

double func2(int n){
    return n*4;
}

// ! 第二种方法,通过函数返回值返回函数指针
void* getFunc2 (int i){
    switch(i){
        case 1:{
            return (void*)func1;
        }
        case 2:{
            // ! 因为函数名本身就是一个地址,所以取地址也没关系
            return (void*)&func2;
        }
        default:{
            cout<<"错误"<<endl;
            exit(1);
        }
    }
}

int main(){
    // ! 第二种方法是通过函数返回值返回函数指针
    double(*p)(int);
    p = (double(*)(int)) getFunc2(1);
    cout<<p(2)<<endl;
    p = (double(*)(int)) getFunc2(2);
    cout<<p(2)<<endl;
}

方法三:通过函数返回值返回定义的函数指针类型

  • 这种方法和方法二基本一样,区别在于需要定义函数指针类型,避免了void*的强制类型转换
  • 代码如下,输出 4, 8
// coding:utf-8
// switch动态获取函数指针
#include<iostream>
using namespace std;
// 定义函数指针类型
typedef double (*p_func)(int);

double func1(int n){
    return n * 2;
}

double func2(int n){
    return n*4;
}

// ! 第三种方法,通过函数返回值返回定义的函数指针
p_func getFunc3 (int i){
    switch(i){
        case 1:{
            return func1;
        }
        case 2:{
            // ! 因为函数名本身就是一个地址,所以取地址也没关系
            return &func2;
        }
        default:{
            cout<<"错误"<<endl;
            exit(1);
        }
    }
}


int main(){
    // ! 第三种方法是通过函数返回值返回定义的函数指针类型
    double(*p1)(int);
    p1 = getFunc3(1);
    cout<<p1(2)<<endl;
    p1 = getFunc3(2);
    cout<<p1(2)<<endl;
}
C++(11):获取函数的参数数量 可以看到,通过该改函数可以获得函数以及类的静态函数的参数的数量。 阅读详情

相关推荐

一文讲清CAN和CANFD的区别

本文将从技术原理、协议特性到应用场景,深度解析两者的核心差异。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 3208

【黑马程序员】从0到1入门学C++ -数据类型-Switch语句-数组-函数-指针-结构体

虽然已经有很多人写了笔记,但我为了查漏补缺,还是重新学习了一遍。我这个笔记重点记录了C++中一些比较容易被忽略的知识点,适合有一定c语言或者c++基础的同学进行复习

mhyasadj的博客 1399

车载以太网入坑指南,从小白到懂哥的进阶之路【技术分享】

各位技术大佬们好!最近公司项目涉及到车载以太网,刚开始完全懵逼,花了大半个月时间各种查资料、测试设备,总算是摸清了门道。想着互联网上卧虎藏龙,肯定有不少大佬对这个技术感兴趣,所以写个帖子分享一下,顺便求各位大佬指点。

starelink的博客 1261

C语言/C++【switch语句详解(用法、规则、流程图、实例)】

C语言/C++【switch语句详解(用法、规则、流程图、实例)】

upward 15万+

手把手教你用STM32的SPI驱动MCP2517FD实现CAN FD通信(附完整代码)

本文详细介绍了如何使用STM32通过SPI驱动MCP2517FD实现CAN FD通信,涵盖硬件连接、SPI驱动编写、寄存器配置及数据收发实战。提供完整代码示例和常见问题排查指南,帮助开发者快速构建高可靠性的CAN FD通信系统,适用于汽车电子和工业控制等领域。

weixin_30607029的博客 674

行人重识别(ReID)基础知识入门

行人重识别(Person re-identification)主要目的是针对出现在监控摄像头内的某个目标行人,准确快速地从监控网络其他摄像头内的大量行人中将这个目标行人标识出来。如图所示一个区域有多个摄像头拍摄视频序列,ReID的要求对一个摄像头下感兴趣的行人,检索到该行人在其他摄像头下出现的所有图片。

用于记录 1万+

【C/C++】四、switch详解

switch语句概述 switch与case,default搭配使用,使得有程序在满足switch判断条件下,走多条case分支的其中一条,否则走default分支,这个switch语句常用情况; switch语法详解 首先,先附上常用switch语法,再以此进行解析。代码如下所示 int main() { switch (IntFlag) { case 1:cout<<"分支1\n"; break; case 2:cout<<"分支2\n"; bre

幸福之家的博客 8324

分子动力学仿真软件:LAMMPS_(16).应用案例分析

通过以上四个应用案例,我们详细介绍了如何使用LAMMPS进行不同系统的分子动力学仿真。从简单的液体水仿真到复杂的纳米管仿真,每个案例都包含了详细的步骤说明和代码示例。读者可以通过这些示例实际操作并验证结果,从而更好地理解LAMMPS的功能和使用方法。希望这些案例能够为读者在分子动力学仿真领域的研究和应用提供帮助。

kkchenjj的博客 837

C | 函数指针数组妙用

铁汁们都知道,指针对C/C++来说就是灵魂,而同类型指针又能封装到数组中。本文就来讲讲函数指针数组的应用场景优化之后代码整洁直观了许多,主要思想就是统一打包。相信函数指针数组还有很多应用场景,快去试试叭~

CGod的博客 1162

初探802.11协议(6)——Wi-Fi 6新特性简介

Wi-Fi 6新机制(特性)介绍

FanFF的博客 1522

166、电流环带宽测试

本文分享了电流环带宽测试的实战经验,揭示了常见误区:误将系统其他环节(如PWM、ADC、传感器)的延迟当作电流环性能。强调带宽测试需先断开速度/位置环,采用扫频法注入正弦信号,结合伯德图分析幅值与相位响应。关键点包括:控制频率步进为对数、确保采样时序精准、避免传感器带宽限制影响结果。文中指出“假带宽”现象(如鼓包、增益超0dB)多源于非线性或机械共振,建议遵循“先开环后闭环”“带宽非越高越好”“阶跃验证”三原则,并建立出厂基准曲线以支持后期故障诊断。

2401_88858637的博客 175

简化代码,C/C++函数指针数组实现菜单系统

我们经常会遇到使用C/C++语言编写一个菜单系统的情况。在控制台窗口打印一个有好多选项的菜单,然后提示你通过输入对应的编号来完成相应的操作。 本文是关于函数指针及函数指针数组的讨论,用于简化代码,省去不必要的重复的代码。

果冻虾仁 4706

机器学习(十九):梯度提升回归(GBR)

机器学习中的梯度提升回归算法原理与案例实战。

全栈川川 5156

【C++】C++函数指针详解与实用技巧

C++中的函数指针是一种指向函数入口地址的指针,常用于回调机制、策略模式等场景。其基本语法为 返回类型 (*指针变量名)(参数类型列表),通过函数指针可以动态调用函数。常见用途包括替代条件语句、作为函数参数(回调机制)、返回函数指针以及使用数组存储多个函数指针进行策略切换。现代C++中推荐使用 std::function 和 Lambda 表达式替代裸函数指针,因其更安全且功能更强大。在Qt中,connect 函数中使用 & 取地址操作符是为了代码清晰性和兼容性,尤其是在处理重载函数时。尽管在某些情

songhuangong123的博客 955

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

使用map+函数指针代替switch和if-else的一个例子

很多时候我们都会遇到用switch或者if-else来进行大量判断的情况,如下面的例子int code = 4; switch (code) { case 0: // break; case 0: // break; case 1: // break; case 2: // break; case 0:

NB_vol_1的专栏 5594

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

switch-case 采用map+函数指针替代

个人觉得不能一味排斥和推崇采用其他方法替代switch-case。 但如果对于一些情况采用map+函数指针去替代switch会极大的优化代码,整洁和使代码不会那么膨胀。 对于多个函数的参数相同的情况下,采用map+函数指针。 比如:分别case 为1,2,3 分别执行不同的函数,如果有很多函数就会导致代码臃肿。 class A { public: int test1(int a); int test2(int a); int test3(int a); int Ge

qq_38409301的博客 1958

使用标准库和函数指针简化switch语句

CopyRight by MikeFeng    如果你是一个Windows GUI程序员,那么经常应该会碰到对于消息的switch吧。面对冗长的switch语句,有什么简化方法呢?    很容易想到对switch的每个case进行包装,这样你的switch就会像下面一样:switch(1) {  case 1:     func1();     break;  cas

云破日出 2581

C++函数指针

声明:本博客是参考了其他牛人的博客加上自己的理解整理而成。                                             参考博客地址:点击打开链接。 1 函数指针简单介绍 1.1 什么是函数指针 函数指针是一个指向函数的指针(呃,貌似是废话),函数指针表示一个函数的入口地址。使用函数指针的好处就是在处理“在运行时根据数据的具体状态来选择相应的处理方式”这

u010949971的博客 402

C++ switch/case的替换方案

目录 1. 常规switch 2. 多态+std::map取代switch 3. 函数指针+std::map取代switch 4. 状态模式取代switch 5. 多态+模板取代switch 1. 常规switch #include <iostream> enum EnumType { enumOne, enumTwo, enumThree }; void sh...

zfjBIT的专栏 2909

使用函数指针来代替switch语句

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <!-- /* Font D

testing2007的专栏 2581

c++中函数指针数组妙用

笔者在开发某软件过程中遇到这样一个问题,前级模块传给我二进制数据,输入参数为 char* buffer和 int length,buffer是数据的首地址,length表示这批数据的长度。数据的特点是:长度不定,类型不定,由第一个字节(buffer[0])标识该数据的类型,共有256(28 )种可能性。我的任务是必须对每一种可能出现的数据类型都要作处理,并且我的模块包含若干个函数,在每个函数里面都...

chen801090的博客 615

C++ 取代switch的三种方法

上述完全是一个面向过程到面向对象的转变:将每个case分支都作为一个子对象,然后用C++语言的多态性去动态绑定。(2)子类代表了一个case,比必须用type去硬编码的case语句更加具有可读性;值得注意的是函数指针要用typedef定义,否则报错。(3)代码的可读性增强,使得分支的维护性增加;(5)避免了漏写break语句造成的隐蔽错误。(4)面向对象的思想更加符合人看世界的方式;(1)分支的增减只要继续派生即可;

草上爬的博客 1万+

Go函数指针是如何让你的程序变慢的?

????导读Go语言的常规优化手段无需赘述,相信大家也能找到大量的经典教程。但基于Go的函数值问题,业界还没有太多深度讨论的内容分享。本文作者根据自己对Go代码的使用与调优经验,分享了Go的函数值对性能影响的原因以及优化方案,值得深度阅读!????目录1 背景2 函数调用的实现方式3 优化4 结论5 参考资料01背景最近在尝试做一些 Go 代码的微观代码优化时,发现由于 Go 中函数调用机制的影...

QcloudCommunity的博客 1127

使用C++11新特性,实现用字符串作为switch的case子句

用字符串作为的c++ switch的case标签。

夸父逐日 2万+

函数指针数组

话说可以通过指针的形式操作数组,只是人们的思维比较喜欢数组形式,所以才诞生了[],也就是说数组其实是可以不需要的。比如下面这个代码:  C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include "stdio.h" #includ

fovwin的专栏 1040
上一篇: 3.无重复字符的最长子串
rdc01234
博客等级 码龄9年 10粉丝 156原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值