[C++]C++ 函数指针 实现 函数名字符串 到 函数调用 cmath.h
来源:互联网 发布:安卓电子书制作软件 编辑:程序博客网 时间:2024/05/16 06:25
代码功能
- 从命令行读取格式为
函数名 数值
的输入,例如:log10 1000
- 在命令行输出调用对应函数名的函数计算结果,例如:
log10(1000) = 3
完整源码
// C++ code#include <iostream>#include <cmath>#include <map>typedef double (* PtrFun) (double x);class FunctionEntry{public: PtrFun pFun; std::string strFun;};std::map <std::string, PtrFun> FunTab;FunctionEntry funEntry = {std::log10, "log10"};int main(){ std::cout << " funEntry.strFun : " << funEntry.strFun << std::endl; FunTab["log10"] = funEntry.pFun; std::cout << std::log10((double)100) << std::endl; std::cout << FunTab["log10"]((double)100) << std::endl; std::string pS; double x; // log10 1000 std::cin >> pS >> x; std::cout << FunTab[pS](x) << std::endl; return 0;}
测试运行
funEntry.strFun : log1022log10 10003--------------------------------Process exited after 5.727 seconds with return value 0请按任意键继续. . .
代码分析
引入标准
- 利用C库自带的函数,调用之直接进行计算;
#include <cmath>
函数指针
- 利用关键词
typedef
声明一种新的类型PtrFun
;
typedef double (* PtrFun) (double x);PtrFun pFun;
- 两种写法等价,
pFun
是一个指向带有double类型的参数又返回double类型的函数的指针,例如: 函数sin(π)
和cos(π)
都接受一个double
类型的参数π(3.1415926...)
,同时会返回相应的一个double
类型的结果0.0
或者-1.0
;- 即只要是接受double类型又返回double类型的函数,诸如
sin cos log log10
等等都可以用这个函数指针来指向;
double (* pFun) (double x);
- 可不可以给一个
int
返回一个double
,可以,那就按照下面这样写,并且全部满足给int
返double
这种格式的函数都可以被pFun2
指向了;
double (* pFun2) (int x);
哈希表
- 建立字符串与对应函数指针之间的联系
std::map <std::string, PtrFun> FunTab;
函数地址
- C库中函数名字就是函数地址,用
std::log10
就是调用以10为底求对数,C++能懂!
FunctionEntry funEntry = {std::log10, "log10"};
- 直接调用函数和通过函数指针调用函数的对比,效果是一样的,都会输出
2
,因为(100 = 10^2
);
// map的写法,使得字符串log10 真正与 函数 std::log10的指针建立起了联系,从而能在O(1)的时间内访问到; FunTab["log10"] = funEntry.pFun; std::cout << std::log10((double)100) << std::endl; std::cout << FunTab["log10"]((double)100) << std::endl;
识别字符串调用对应函数
- 命令行标准读入代表函数名的字符串pS 以及 想要计算的数值;
- 通过哈希表找到对应的函数指针FunTab[pS];
- 通过函数指针直接 调用函数FunTab[pS] (x);
std::string pS; double x; // log10 1000 std::cin >> pS >> x; std::cout << FunTab[pS](x) << std::endl;
引用参考
[1] cmath
http://www.cplusplus.com/reference/cmath/
[2] C++ STL map
http://www.cplusplus.com/reference/map/
[3] C++ 函数指针 Pointers to functions
http://www.cplusplus.com/doc/tutorial/pointers/
[4] 《C++实践之路》(C++ In Action Industrial Strength Programming) 第5章 5.5函数表
http://www.relisoft.com/book/
0 0
- [C++]C++ 函数指针 实现 函数名字符串 到 函数调用 cmath.h
- 通过函数名字符串调用函数【C语言版】
- 199 c 通过函数名字符串调用函数
- C函数名与函数指针
- [C]通过函数指针得到函数名
- C语言函数名与函数指针
- C语言函数名与函数指针
- [linux,c++] 使用指针函数实现多个函数调用
- Cmath函数
- C语言调用函数指针
- C字符串函数实现
- C字符串函数实现
- C/C++<string.h>字符串函数
- C/C++ 函数指针调用函数
- C语言函数指针调用函数
- C/C++函数指针变量调用函数
- 彻底搞定C指针-函数名与函数指针
- 彻底搞定C指针-函数名与函数指针
- 类成员修饰符与访问能力之间的关系
- 递归算法计算阶乘
- storm分布式实时计算框架搭建
- MATLAB作业1
- 双向链表
- [C++]C++ 函数指针 实现 函数名字符串 到 函数调用 cmath.h
- JAVA开发Web Service几种框架介绍
- 第一次安装Android studio时需要注意的地方
- jdbc 学习笔记
- python实现多进程
- 字符串扩展
- Tensorflow入门:数据结构和编程思想
- Java关系运算
- 我的软件工程课目标