久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx

C++反射的實現方法詳解-創新互聯

這篇文章主要介紹“C++反射的實現方法詳解”,在日常操作中,相信很多人在C++反射的實現方法詳解問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++反射的實現方法詳解”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

成都創新互聯主營詔安網站建設的網絡公司,主營網站建設方案,成都app軟件開發,詔安h5微信小程序開發搭建,詔安網站營銷推廣歡迎詔安等地區企業咨詢

一、注冊輔助類

ClassRegistry:模板函數,用于data、module、contextdata的注冊,其中的函數解析:

create_object:從RegistryMap里找到傳入name對應的RegistryNode(RegistryNode保存了名字和構造函數),調用構造函數返回。

register_class:用傳入的name和constructor注冊RegistryMap,只在Register的構造函數里面調用,后面會在ClassRegister<IData> DataRegister、ClassRegister<IModule> ModuleRegister、ClassRegister<IContextData> ContextDataRegister用到。RegistryMap里面的數據是從register_class這個方法插入數據進去的,后面會在IMPLEMENT_XXX中調用到這個。

fill_name_array:找到RegistryMap里面注冊的name,插入傳入參數。

二、使用到的宏定義

2.1 data

REGISTER_DATA:聲明構造data_class的函數 __construct_##name##_data() ,其中調用了data_calss的構造函數;聲明獲取class的get_##name,函數體的get_data從 sign_data_map里面獲取到對應的IData

#define REGISTER_DATA(data_class, name)          \ inline ::wmf::IData* __construct_##name##_data() { return new data_class; } \ namespace wmf {                \ namespace internal {              \ inline data_class* get_##name() { return get_data<data_class>(#name); }  \ }                   \ } // wmf::internal

IMPLEMENT_DATA:調用DataRegister的構造函數。聲明變量__##name##_module_register,這里會將輸入的name和構造函數__construct_##name##_data注冊到RegistryMap中;

#define IMPLEMENT_DATA(name)        \ ::wmf::internal::DataRegister __##name##_module_register( \  #name, __construct_##name##_data)

使用:

在需要用到的.cpp文件的的.h文件的位置調用REGISTER_DATA,聲明構造函數和獲取data的get_xxx函數。

在每個service的cpp文件視線中調用IMPLEMENT_DATA,注入RegistryMap。

在每個service的cpp文件的InitInjection中,INJECT_DATA_MODULE_DEPENDENCY把這個詞典注入到module中。

2.2 module

REGISTER_MODULE:聲明__construct_#name##_module(),返回new module_class;

聲明獲取class的get_##name,函數體里面返回ModuleMap中保存的對象(cast_module從ModuleMap里面找到其對應的對象,如果找不到,則從RegisterMap里面找到其構造函數,并調用create_object之后插入ModuleMap,并返回新建的對象(RegisterMap里面的數據從IMPLEMENT_XXX來的))

#define REGISTER_MODULE(module_class, name)    \ inline ::wmf::IModule* __construct_##name##_module() { \ return new module_class;        \ }              \ namespace wmf {          \ namespace internal {         \ inline module_class* get_##name(::wmf::Context& ctx) { \ return ctx.cast_module<module_class>(#name);   \ }              \ }              \ } // wmf::internal

IMPLEMENT_MODULE:聲明__##name##_module_register變量,以插入RegistryMap。

#define IMPLEMENT_MODULE(name)        \ ::wmf::internal::ModuleRegister __##name##_module_register( \  #name, __construct_##name##_module)

使用:

在新增module的.h文件最后調用REGISTER_MODULE聲明了在IMPLEMENT_MODULE中會用到的構造函數,以及聲明了從ModuleMap中獲取其對象的get_xxx函數。

在service的最后調用IMPLEMENT_MODULE,把module注冊到RegistryMap中。

2.3 context data

REGISTER_CONTEXT_DATA:聲明__construct_##name##_context_data(),新建data_class;

聲明獲取class的get_##name,函數體里面通過name查找到ContextDataMap保存的名字簽名對應的IContextData,轉換為data_class返回。

#define REGISTER_CONTEXT_DATA(data_class, name)           \ inline ::wmf::IContextData* __construct_##name##_context_data() { \  return new data_class;                     \ }                                 \ namespace wmf {                          \ namespace internal {                       \ inline data_class* get_##name(const ::wmf::Context& ctx) {    \  return ctx.cast_context_data<data_class>(#name);        \ }                                 \ }                                 \ } // wmf::internal

IMPLEMENT_CONTEXT_DATA:聲明__##name##_context_data變量,這里會將輸入的name和構造函數__construct_##name##_context_data注冊到RegistryMap中;

#define IMPLEMENT_CONTEXT_DATA(name)              \ ::wmf::internal::ContextDataRegister __##name##_context_data( \   #name, __construct_##name##_context_data)

2.4 index_data

DECLARE_INDEX_DATA:N for name, VT for VersionIndex 類型。聲明類型C為用類型VT組裝,path、name、desc用N組裝的VIAdaptor類型。

#define DECLARE_INDEX_DATA(VT, C, N)                    \ extern const char __index_##N##_path[];                  \ extern const char __index_##N##_name[];                  \ extern const char __index_##N##_desc[];                  \ typedef wmf::VIAdaptor<argument_type<void(VT)>::type, __index_##N##_path, \             __index_##N##_name, __index_##N##_desc>      \   C

DEFINE_INDEX_DATA:N for name,這里是聲明一堆string變量,用于data的path、name、desc。

#define DEFINE_INDEX_DATA(N)            \ const char __index_##N##_path[] = #N "_path";   \ const char __index_##N##_name[] = #N "_name";   \ const char __index_##N##_desc[] = #N "_desc";   \ DEFINE_string(N##_path, "", "index " #N " path"); \ DEFINE_string(N##_name, "", "index " #N " name"); \ DEFINE_string(N##_desc, "index_" #N, "index " #N " desc")

2.5 injection

DEFINE_INJECTION:定義一個把object_ref變量設置為class_type*類型的傳入變量的函數。

#define DEFINE_INJECTION(injection_name, class_type, object_ref) \ void set_##injection_name(class_type* module) { object_ref = module; }

INJECT_OBJECT_OBJECT_DEPENDENCY:調用object_to這個對象的set_##injection_name方法,傳入參數是object_from的引用。結合DEFINE_INJECTION就是把object_from設置到object_to這個對象里面。

#define INJECT_OBJECT_OBJECT_DEPENDENCY(injection_name, object_from, \                    object_to)          \ (object_to).set_##injection_name(&(object_from))

INJECT_MODULE_DEPENDENCY:在上下文context中找到module_from的變量,注入到同一個上下文的module_from里面。

#define INJECT_MODULE_DEPENDENCY(injection_point, context, module_from, \                 module_to)               \ ::wmf::internal::get_##module_to(context)->set_##injection_point(   \   ::wmf::internal::get_##module_from(context));

INJECT_DATA_MODULE_DEPENDENCY:把data注入到通過上下文context獲取的module_to中。

#define INJECT_DATA_MODULE_DEPENDENCY(injection_point, context, data, \                   module_to)           \ ::wmf::internal::get_##module_to(context)->set_##injection_point(  \   ::wmf::internal::get_##data());

INJECT_MODULE_OBJECT_DEPENDENCY:通過上下文context獲取的module_from注入到object_to中。

#define INJECT_MODULE_OBJECT_DEPENDENCY(injection_point, context, module_from, \                    object_to)               \ (object_to).set_##injection_point(                      \   ::wmf::internal::get_##module_from(context));

INJECT_OBJECT_MODULE_DEPENDENCY :object_from注入到通過上下文獲取的module_to中。

#define INJECT_OBJECT_MODULE_DEPENDENCY(injection_point, context, object_from, \                    module_to)               \ ::wmf::internal::get_##module_to(context)->set_##injection_point(      \   &(object_from))

使用:

在上下文相關的session中調用INJECT_MODULE_DEPENDENCY、INJECT_DATA_MODULE_DEPENDENCY;

INJECT_MODULE_DEPENDENCY用于把session相關的信息(比如session_docs、request、response)注入到module中,module的意思是這個請求需要過的模塊名。

INJECT_DATA_MODULE_DEPENDENCY用于把data注入到module中。

三、總結

3.1 新增一個module

在新增module的.h文件最后調用REGISTER_MODULE聲明了在IMPLEMENT_MODULE中會用到的構造函數,以及聲明了從ModuleMap中獲取其對象的get_xxx函數。

在service的最后調用IMPLEMENT_MODULE,把module注冊到RegistryMap中。

在上下文相關的session中調用INJECT_MODULE_DEPENDENCY、INJECT_DATA_MODULE_DEPENDENCY;

INJECT_MODULE_DEPENDENCY用于把session相關的信息(比如session_docs、request、response)注入到module中,module的意思是這個請求需要過的模塊名。

INJECT_DATA_MODULE_DEPENDENCY用于把data注入到module中。

3.2 代碼回顧

ClassRegistry用于給第二項的一堆宏使用。module于類的映射關鍵在于RegistryMap,新增一個module的時候,服務會去RegistryMap里面找名字對應的構造函數。RegistryMap里面的數據是在IMPLEMENT_MODULE的時候注入進來的name和類的對應關系。配置文件里面配的是module的鏈條,比如需要過AModule,BModule,這時候就在init的時候把所有module都插進去,然后在schedule_impl里面調用每個module的run函數。

到此,關于“C++反射的實現方法詳解”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注創新互聯網站,小編會繼續努力為大家帶來更多實用的文章!

標題名稱:C++反射的實現方法詳解-創新互聯
當前地址:http://www.js-pz168.com/article32/cohhpc.html

成都網站建設公司_創新互聯,為您提供品牌網站制作外貿網站建設虛擬主機營銷型網站建設面包屑導航自適應網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

外貿網站建設
久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx
一区二区高清视频在线观看| 国产馆精品极品| 成人黄色软件下载| 国产日韩三区| 色婷婷av一区二区三区之一色屋| 欧美一区二视频| 中文字幕色av一区二区三区| 美美哒免费高清在线观看视频一区二区| 成人av电影在线播放| 午夜精品区一区二区三| 日韩午夜在线影院| 亚洲精品视频在线观看免费| 国产麻豆视频一区| 欧美成人在线免费观看| 欧美日韩精品免费观看视频| 国产精品国产三级国产aⅴ无密码| 日本欧美久久久久免费播放网| 91一区二区三区| 91福利小视频| 中文字幕不卡的av| 狠狠色综合日日| 精品日本一区二区三区| 51精品视频一区二区三区| 亚洲精品亚洲人成人网在线播放| 国产成人av一区二区三区在线 | 日本一区二区免费在线| 免费xxxx性欧美18vr| 福利精品视频| 欧美情侣在线播放| 亚洲免费在线播放| 波多野结衣的一区二区三区| 亚洲高清在线播放| 国产三级精品三级| 激情综合网天天干| 日本一区二区三区视频在线播放| 精品日韩99亚洲| 日韩国产欧美一区二区三区| 国产欧美一区二区三区另类精品| 欧美日韩一级视频| 一区二区三区蜜桃| 91女人视频在线观看| 欧美日韩综合在线免费观看| 亚洲欧美日韩中文播放| av午夜精品一区二区三区| 91福利视频久久久久| 亚洲精品自拍动漫在线| 99国产精品一区| 欧美色综合网站| 亚洲尤物视频在线| 成人综合av网| 日韩视频免费直播| 美女久久久精品| 日韩免费三级| 国产精品福利电影一区二区三区四区| 成人免费黄色在线| 欧美三级中文字| 亚州成人在线电影| 久久久福利视频| 久久久午夜精品| 国产精品996| 在线观看亚洲专区| 亚洲午夜一二三区视频| 国产精品亚洲综合| 久久综合久色欧美综合狠狠| 国产一区二区三区在线观看免费 | 在线视频一区二区免费| 亚洲综合一区二区三区| 日韩精品影音先锋| 国产乱色国产精品免费视频| 日本福利一区二区三区| 国产农村妇女精品| 不卡的av网站| 69堂精品视频| 精品午夜久久福利影院| 一本色道a无线码一区v| 夜夜精品视频一区二区| 久久国产精品-国产精品| 国产亚洲制服色| 成人av电影在线| 日韩一二在线观看| 国产一区二区精品久久| 欧美日韩亚洲综合在线| 蜜臀av一区二区| 中文字幕一区二区三区乱码| 一区二区三区高清在线| 麻豆传媒一区二区| 最新日韩av在线| 国产在线精品日韩| 欧美国产日韩a欧美在线观看| 99re热视频精品| 久久夜色精品国产欧美乱极品| 成人中文字幕在线| 日韩视频一区二区在线观看| 国产高清成人在线| 6080国产精品一区二区| 国产乱码一区二区三区| 91精品国产综合久久久久久久久久| 久久不见久久见免费视频7| 在线观看一区日韩| 蜜臀av一区二区| 欧美午夜精品一区二区三区| 美女网站色91| 欧美亚洲国产一区二区三区| 麻豆精品视频在线观看视频| 日本大香伊一区二区三区| 日本va欧美va欧美va精品| 91福利国产成人精品照片| 喷水一区二区三区| 欧美日韩亚洲另类| 国产一区二区三区香蕉| 日韩欧美激情在线| 99久久精品一区二区| 国产视频亚洲色图| 国产午夜精品一区| 亚洲免费看黄网站| 欧美一级爱爱| 午夜在线成人av| 欧美综合一区二区| 狠狠久久亚洲欧美| 日韩美女视频在线| 91麻豆精东视频| 欧美激情在线免费观看| 精品国产免费久久久久久尖叫 | 91精品国产综合久久精品app| 成人一区二区三区视频| 久久一留热品黄| 国产在线一区二| 一区二区三区在线高清| 在线国产伦理一区| 国产一区二区视频在线| 精品久久久久av影院 | 国产一区二区福利视频| 精品国产自在久精品国产| 99久久精品久久久久久ai换脸| 国产精品不卡视频| 少妇精品久久久久久久久久| 日韩成人一区二区| 7777精品伊人久久久大香线蕉| www.亚洲国产| 综合网在线视频| 亚洲蜜桃在线| 国产精品一区二区免费不卡| 久久这里只有精品首页| 国产综合第一页| 三级不卡在线观看| 91麻豆精品国产91久久久使用方法| 91免费小视频| 有坂深雪av一区二区精品| 色综合激情五月| 成人精品视频.| 亚洲天堂网中文字| 色综合久久久久网| 成人亚洲一区二区一| 国产精品久久久久影院亚瑟 | 日韩精品免费视频人成| 91精品国产综合久久小美女| av电影成人| 亚洲大片精品永久免费| 欧美一区二区三区人| 国产精华一区二区三区| 亚洲高清免费观看高清完整版在线观看| 欧美探花视频资源| 91传媒免费看| 亚洲777理论| 日韩精品在线一区| 欧美午夜精品理论片a级大开眼界| 伦理电影国产精品| 国产婷婷色一区二区三区四区| 视频一区不卡| 国产成人午夜99999| 亚洲人成网站色在线观看| 欧美三级电影在线看| 国产成人免费电影| 日本亚洲免费观看| 国产午夜亚洲精品午夜鲁丝片 | 国产99在线播放| 男女男精品视频| 久久美女高清视频| 色综合久久久久综合体| 7777精品久久久大香线蕉小说| 亚洲电影一区二区| 亚洲精品一区二区三区蜜桃下载| 日本一区二区精品视频| 成人黄色免费短视频| 亚洲一区二区视频在线| 日韩欧美高清一区| 亚洲a∨一区二区三区| 成人免费视频一区二区| 亚洲高清久久久| 久久综合色婷婷| 色先锋久久av资源部| 97免费资源站| 麻豆精品在线观看| 中文字幕一区二区三| 欧美浪妇xxxx高跟鞋交| 久久国产精品99久久久久久丝袜| 国产精品一区二区免费不卡| 一区二区三区在线视频播放| 日韩欧美国产wwwww| 伊人天天久久大香线蕉av色|