EOS插件初始化机制讲解
EOS插件初始化采用的技术
EOS插件初始化采用技术有C++多态技术、函数模板及代理设计模式。采用C++多态技术可以将所有插件存放在一类容器中进行迭代访问。函数模板使代码在编写代码时方便进行插件加载,为后续扩展奠定了基础。而采用代理设计模式和函数模板技术综合使用,使插件只需要满足模板接口即可,使插件功能扩展的性能更加强大。在EOS插件初始化中采用C11-14的新语法如变长的模板参数及vector新式初始化操作。
EOS插件的初始化步步跟踪
1、EOS插件初始化调用
EOS插件初始代码使用了插件的类型作为了模板参数,且是变长模板参数,如果以后EOS要加载其它的插件,只需要把插件类型添加到模板参数即可。这段代码的意思是采用插件的类型去实例化application类中的initialize模板函数。
2、EOS插件初始化实现
template<typename... Plugin>
bool initialize(int argc, char** argv) {
return initialize_impl(argc, argv, {find_plugin<Plugin>()...});
}
在这里首先要说明的是Plugin是个模板参数的名称,不是EOS代码中的插件类的父类。因为两都名称相同且含义有些相近,容易造成把模板名称与插件类的父类混淆。
在这里先将代码107行的模板展开的样子写出来,
bool initialize(int argc, char** argv) {
return initialize_impl(argc, argv, {find_plugin<chain_plugin>(),
find_plugin<http_plugin>(),
find_plugin<net_plugin>(),
find_plugin<producer_plugin>()});
}
这段代码展开主要用到了变长模板展开特性,以逗号分隔,逐个展开,整个花括号内部采用的vector的C++11-14的初始化语法。
find_plugin模板就是普通的模板替换,这个容易理解。在插件的实现上请参考《EOS插件继承机制讲解》博文,内部有详细描述。https://www.jianshu.com/p/dfcf86e17fca