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