首先创建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
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
#include
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<<"函数:"<"不在函数表内无法调用"<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"<void funca_impl2(student stu1,student stu2,void *p){
cout<<"impl2 is called"<
然后在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);
}