EOS插件初始化機(jī)制講解
EOS插件初始化采用的技術(shù)
??????EOS插件初始化采用技術(shù)有C++多態(tài)技術(shù)往声、函數(shù)模板及代理設(shè)計(jì)模式督弓。采用C++多態(tài)技術(shù)可以將所有插件存放在一類容器中進(jìn)行迭代訪問芦圾。函數(shù)模板使代碼在編寫代碼時(shí)方便進(jìn)行插件加載,為后續(xù)擴(kuò)展奠定了基礎(chǔ)帝牡。而采用代理設(shè)計(jì)模式和函數(shù)模板技術(shù)綜合使用往毡,使插件只需要滿足模板接口即可,使插件功能擴(kuò)展的性能更加強(qiáng)大靶溜。在EOS插件初始化中采用C11-14的新語法如變長(zhǎng)的模板參數(shù)及vector新式初始化操作开瞭。
EOS插件的初始化步步跟蹤
1、EOS插件初始化調(diào)用
??????EOS插件初始代碼使用了插件的類型作為了模板參數(shù)罩息,且是變長(zhǎng)模板參數(shù)嗤详,如果以后EOS要加載其它的插件,只需要把插件類型添加到模板參數(shù)即可瓷炮。這段代碼的意思是采用插件的類型去實(shí)例化application類中的initialize模板函數(shù)葱色。
2、EOS插件初始化實(shí)現(xiàn)
template<typename... Plugin>
bool initialize(int argc, char** argv) {
return initialize_impl(argc, argv, {find_plugin<Plugin>()...});
}
在這里首先要說明的是Plugin是個(gè)模板參數(shù)的名稱娘香,不是EOS代碼中的插件類的父類苍狰。因?yàn)閮啥济Q相同且含義有些相近,容易造成把模板名稱與插件類的父類混淆烘绽。
在這里先將代碼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>()});
}
這段代碼展開主要用到了變長(zhǎng)模板展開特性淋昭,以逗號(hào)分隔,逐個(gè)展開安接,整個(gè)花括號(hào)內(nèi)部采用的vector的C++11-14的初始化語法翔忽。
find_plugin模板就是普通的模板替換,這個(gè)容易理解盏檐。在插件的實(shí)現(xiàn)上請(qǐng)參考《EOS插件繼承機(jī)制講解》博文歇式,內(nèi)部有詳細(xì)描述。http://www.reibang.com/p/dfcf86e17fca