菜鸟笔记
提升您的技术认知

c++反射机制

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);