[C++]C++ 函数指针 实现 函数名字符串 到 函数调用 cmath.h
2017-03-12 14:15
435 查看
代码功能
从命令行读取格式为函数名 数值的输入,例如:
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 : log10 2 2 log10 1000 3 -------------------------------- 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] cmathhttp://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/
相关文章推荐
- C/C++—— 在构造函数中调用虚函数能实现多态吗(Vptr指针初始化的过程分析)
- 不调用库函数,实现字符串复制函数char * strcpy(char * dst, const char * src) C/C++软件开发求职面试题 必备考点(二)
- C/C++学习之C提高----函数调用模型、指针做函数参数、字符串的基本操作、一级指针内存模型建立
- C#调用C++DLL的小总结8---C++Dll中函数返回字符串指针
- 模版函数指针,C++委托的实现
- C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)
- C++ vptr vtbl (C++虚表指针,虚函数表,虚函数的实现)很多人都喜欢问这个,写下吧。
- 不调用C库函数string.h实现字符串的连接
- [华赛面试题] C语言动态分配内存 用指针实现字符串的函数体外打印
- C++中的成员函数调用原理及this指针的传递方式
- 在C++中,要实现动态联编,必须使用(基类指针)调用虚函
- C++学习笔记(13)——利用对象、引用、指针调用虚函数
- 用C语言来实现的类似C++函数的重载特性-----void*指针闲谈
- 模版函数指针,C++委托的实现-原创
- 简析function/bind如何实现类成员函数指针绑定调用
- 模版函数指针,C++委托的实现
- C#中调用C++的dll的参数为指针类型的导出函数
- 转: C++指针直接调用类成员函数探讨
- 使用IDispatch::Invoke函数在C++中调用C#实现的托管类库方法
- C++指针直接调用类成员函数探讨