c++根据传入的字符串,动态调用对应的函数,目的是手工实现运行时函数的改变

首先创建a.h,a.cpp,和b.cpp是三个文件。
1.a.h里面,包含三个函数,三个函数分别为,funca_wrapper, funca_impl1, funca_impl2,这三个
函数的函数签名(参数个数,类型和顺序)完全一样,提供一个辅助函数get_func_impl,
该函数根据传入的函数名字动态调用对应的函数(funca_impl1或funca_impl2),
2. a.cpp里面,funca_wrapper最终通过调用辅助函数get_func_impl的方式调用funca_impl1或funca_impl2
3. b.cpp里面,调用funca_wrapper


a.h

#ifndef A_H_
#define A_H_
#include<iostream>
using namespace std;
struct student{
 int age;
 int height;
};
void funca_wrapper(student stu1,student stu2,void *p);
void funca_impl1(student stu1,student stu2,void *p);
void funca_impl2(student stu1,student stu2,void *p);
//char get_func_impl(char* func_name, int len);

#endif

下面通过a.cpp来实现a.h中声明的函数
a.cpp

#include"a.h"
#include <map>
#include<string>
typedef void (*PF)(student st,student st1,void *p1);//定义一个函数指针
map<string,PF> strFuncMap;//定义一个Map用来存放函数名和函数地址


void buildMap(){
    strFuncMap["funca_impl1"]=&funca_impl1;//把函数名字和对应的函数地址存到Map里面
    strFuncMap["funca_impl2"]=&funca_impl2;
}

void get_func_impl(const string &func_name, int len,student s1,student s2,void *p){

      if(strFuncMap.count(func_name))//如果传入的函数名在Map表中就返回该函数的地址
      (*strFuncMap[func_name])(s1,s2,p);
// return strFuncMap[func_name];
    else
      cout<<"函数:"<<func_name<<"不在函数表内无法调用"<<endl;

}

void funca_wrapper(student stu1,student stu2,void *p){

buildMap();
get_func_impl("funca_impl1",11,stu1,stu2,p);//根据传入的函数名动态调用该函数
get_func_impl("funca_impl2",11,stu1,stu2,p);
get_func_impl("funca_impl3",11,stu1,stu2,p);//此处当函数名不在Map表中会引发段错误,这是一个bug

}
void funca_impl1(student stu1,student stu2,void *p){
   cout<<"impl1 is called"<<endl;

}
void funca_impl2(student stu1,student stu2,void *p){
 cout<<"impl2 is called"<<endl;

}

然后在b.cpp中调用funca_wrapper
b.cpp

#include "a.h"
int main(){
student s,s1;
s1.age=11;
s1.height=171;
s.age=10;
s.height=170;
void *p1=NULL;
funca_wrapper(s,s1,p1);
}

最后编译打印结果:
打印结果

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值