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;
}