rpc远程调用实现

bind函数(包装器)

就是先弄了个最顶层封装的Function,接收可调用函数和俩Datestream(里面是参数),然后用std的bind绑定wrap和fun和俩Datastream,发生如下操作(很多是编译期执行 )

包装器的第一参就是wrap,我们用模板来识别可调用函数的函数签名(返回值和参数列表),然后对args参数列表识别实际参数类型,然后使用这个些参数类型,定义出一个<>内部是这些的tuple

然后识别tuple模板参数个数,然后make出对应的下标列表index_sequence,然后把列表中的Id…开包,对每一个Id调用get,然后把Datestream内部的参数注入进get返回的引用

ps:bind这个操作只是生成了对应的fun和序列化的交互函数(使用std::bind),真正调用还在call,就是直接传入俩Datastream然后string名字匹配哈希表(value就是bind产生的function),然后就会去执行生成的模板函数了

ps:模板参数的命名就是函数模板就是F,返回类型就是R,元组的类型就是Tuple

二更:所以第一次wrap是bind主体,第二次wrap是为了分割出args和返回类型并且放进function,第三次wrap就是执行主体
图片1
三更:这边function说只要两个参数,因为虽然内置的wrap还要求了一个fun,但是因为他已经被bind绑入了(包括this指针),所以确实参数就只需要那俩占位符,即这样操作bind就会生成一个function,返回类型是void且接受俩参数的
图片1
三更:而且模板参数在传递的时候是不会发生改变的,只有一步从F函数指针变成了R和args,然后返回值的识别有一次是通过F向R转换,还有一次是手动指定的
图片1
图片1
然后是客户端调用
图片1
然后是work函数
图片1
图片1