1、什么是反射?
通过字符串函数名称来实现函数的调用就是反射。
2、如何实现?
使用map,key为string保存函数名称,val为函数指针。
但是因为map初始化时必须制定key,val的类型,如果我们想使用一个map来实现各种不同参数列表的函数反射就无能为力了。
因此可以借助于模板来使用一个map来实现各种不同参数列表的函数反射。参考rpc原理剖析。
map不直接存需要被反射的函数指针,而是存一个我们制定的模板函数指针,把需要被反射的函数指针作为我们指定模板函数的一个参数。
比如我们使用一个map来实现下面两个不同参数列表的函数反射。
void foo1(int);
float foo2(float);
首先指定一个模板函数
template
void call(f fun,serializer*ds,char*data,int len){
//需要在借助于一个函数来解析f类型
callproxy(fun,ds,data,len);
}
template
void callproxy(std::functionfun){
//使用tuple从data得到参数列表args
r = std::invoke(fun,args);
把r放入到ds序列化返回值
}
map>handler;
template
void bind(string name,f fun){
handler[name]=std::bind(call ,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3);
}
//如何调用
准备好传入传出参数。
serializer *ds = new serializer();
char * data;
int len;
handlers["foo1"](ds,data,len);