C++通过一个函数名的字符串调用对应的函数
函数按名调用
假设现有多个函数,如果要根据输入的名字和参数进行相应的调用,如果是在python,可以直接将一个函数名字符串和函数对象的映射存入一个字典,然后直接取出函数就能调用。
def func_1(x, y):
return x + y
def func_2(x):
return x*x
def func_3():
print("function 3")
func_map = {
"fun1" : func_1,
"fun2" : func_2,
"fun3" : func_3,
}
fun_name = "fun1"
if fun_name in func_map.keys():
func = func_map[fun_name]
func(1,2) # 传入参数 要根据实际的每个函数参数判断
在c++中要实现这样的功能,也可以借助哈希表,将一个名字字符串和函数对象映射存入表。但是,c++的hashmap,value只能存放相同类型的变量(可以使用一些方法让容器存放不同类型的数据,但是比较麻烦)。
函数是通过它的函数签名来唯一确定的,要想将不同的函数(返回值类型不同、或是参数个数和类型不同等)放入一个map,首先要将他们“二次封装”为具有相同“格式”的函数。
可以使用函数指针/对象来描述一类相同的函数。如下所示,typedef int (*FunPt)(int,int);
定义了FunPt
类型,它指向的是一种函数,这个函数的特点是 返回值 int, 具有两个int参数。因此,所有有这种格式的函数都可以用FunPt的指针指向。
定义函数指针变量的语法是typedef 函数返回类型 (*名字)(参数1类型,参数2类型,...)
。
#include<map>
using namespace std;
typedef int (*FunPt)(int,int); // 定义了一种新的类型
int fun1(int a, int b){
return a+b;
}
int fun2(int a, int b){
return a*b;
}
map<string, FunPt> mm = {
{"fun1", fun1},
{"fun2", fun2},
};
可以通过函数指针变量来指向某个函数,那么直接将所有的函数封装为具有相同格式的函数就行了。另一个问题是这些要调用的函数,它们的返回值和参数个数不一,要封装为相同格式的话,可以使用vector存放所有的参数,实际调用那个函数的时候转为相应类型。返回值可以使用封装后的返回函数返回,或者传入第二个参数,将这个参数作为实际调用产生的返回值。
// 将相关的函数 封装为 返回bool 参数是char * 的list
typedef bool (*FunPt)(vector<char *>); // 定义了一种新的类型
int fun1(int a, int b){
return a+b;
}
int fun2(int a, int b){
return a*b;
}
bool fun1_warpper(vector<char*> args, int &result){
if (args.size() != 2){
printf("输入参数个数不对");
return false;
}
// 然后将 参数转为实际上的类型
int a = atoi(args[0]);
int b = atoi(args[1]);
result = fun1(a,b);
return true;
}
bool fun2_warpper(vector<char*> args, int &result){
if (args.size() != 1){
printf("输入参数个数不对");
return false;
}
// 然后将 参数转为实际上的类型
int a = atoi(args[0]);
result = fun2(a);
return true;
}
map<string, FunPt> mm = {
{"fun1", fun1_warpper},
{"fun2", fun2_warpper},
};
除了使用函数指针,c++11还可以使用std::function
来定义一个函数对象。它的格式也是function<返回值类型(参数1类型,参数2类型)>
,通过该方法声明一个函数对象的变量。
int fun1(int a,int b){
}
std::function<int(int, int)> func = fun1; // 然后可以使用func(a,b)调用 fun1这个函数
map<string, std::function<int(int,int)>> funcMap =
{{ "add", fun1}, // 同时也可以把相同格式的函数存入map
{ "sub", fun2}
};
参考
原文地址:https://www.cnblogs.com/muyisun/p/15000022.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 基于maven+ssm的增删改查之maven环境的搭建
- (22)Bash环境变量
- maven之在eclipse中创建maven项目
- wiki百科之将词转换为索引表示
- 【LeetCode】找出数组中重复的数字day01
- pytorch实现的transformer代码分析
- 终于搞懂HashMap的源码了!!!
- (21)Bash用户自定义变量
- python实现支持向量机之具体实现
- Spring boot 集成apollo达到配置的热加载
- ApplicationContext 和beanFactory 和 factoryBean的区别以及联系
- pytorch中的nn.Embedding
- redis的持久化存储AOF的原理
- (三十四)golang--接口
- 回溯法--八皇后问题