日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C++反射的實現(xiàn)方法詳解-創(chuàng)新互聯(lián)

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

成都創(chuàng)新互聯(lián)主營詔安網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app軟件開發(fā),詔安h5微信小程序開發(fā)搭建,詔安網(wǎng)站營銷推廣歡迎詔安等地區(qū)企業(yè)咨詢

一、注冊輔助類

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

create_object:從RegistryMap里找到傳入name對應(yīng)的RegistryNode(RegistryNode保存了名字和構(gòu)造函數(shù)),調(diào)用構(gòu)造函數(shù)返回。

register_class:用傳入的name和constructor注冊RegistryMap,只在Register的構(gòu)造函數(shù)里面調(diào)用,后面會在ClassRegister DataRegister、ClassRegister ModuleRegister、ClassRegister ContextDataRegister用到。RegistryMap里面的數(shù)據(jù)是從register_class這個方法插入數(shù)據(jù)進(jìn)去的,后面會在IMPLEMENT_XXX中調(diào)用到這個。

fill_name_array:找到RegistryMap里面注冊的name,插入傳入?yún)?shù)。

二、使用到的宏定義

2.1 data

REGISTER_DATA:聲明構(gòu)造data_class的函數(shù) __construct_##name##_data() ,其中調(diào)用了data_calss的構(gòu)造函數(shù);聲明獲取class的get_##name,函數(shù)體的get_data從 sign_data_map里面獲取到對應(yīng)的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(#name); }  \ }                   \ } // wmf::internal

IMPLEMENT_DATA:調(diào)用DataRegister的構(gòu)造函數(shù)。聲明變量__##name##_module_register,這里會將輸入的name和構(gòu)造函數(shù)__construct_##name##_data注冊到RegistryMap中;

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

使用:

在需要用到的.cpp文件的的.h文件的位置調(diào)用REGISTER_DATA,聲明構(gòu)造函數(shù)和獲取data的get_xxx函數(shù)。

在每個service的cpp文件視線中調(diào)用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,函數(shù)體里面返回ModuleMap中保存的對象(cast_module從ModuleMap里面找到其對應(yīng)的對象,如果找不到,則從RegisterMap里面找到其構(gòu)造函數(shù),并調(diào)用create_object之后插入ModuleMap,并返回新建的對象(RegisterMap里面的數(shù)據(jù)從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(#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文件最后調(diào)用REGISTER_MODULE聲明了在IMPLEMENT_MODULE中會用到的構(gòu)造函數(shù),以及聲明了從ModuleMap中獲取其對象的get_xxx函數(shù)。

在service的最后調(diào)用IMPLEMENT_MODULE,把module注冊到RegistryMap中。

2.3 context data

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

聲明獲取class的get_##name,函數(shù)體里面通過name查找到ContextDataMap保存的名字簽名對應(yīng)的IContextData,轉(zhuǎn)換為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(#name);        \ }                                 \ }                                 \ } // wmf::internal

IMPLEMENT_CONTEXT_DATA:聲明__##name##_context_data變量,這里會將輸入的name和構(gòu)造函數(shù)__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::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變量設(shè)置為class_type*類型的傳入變量的函數(shù)。

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

INJECT_OBJECT_OBJECT_DEPENDENCY:調(diào)用object_to這個對象的set_##injection_name方法,傳入?yún)?shù)是object_from的引用。結(jié)合DEFINE_INJECTION就是把object_from設(shè)置到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))

使用:

在上下文相關(guān)的session中調(diào)用INJECT_MODULE_DEPENDENCY、INJECT_DATA_MODULE_DEPENDENCY;

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

INJECT_DATA_MODULE_DEPENDENCY用于把data注入到module中。

三、總結(jié)

3.1 新增一個module

在新增module的.h文件最后調(diào)用REGISTER_MODULE聲明了在IMPLEMENT_MODULE中會用到的構(gòu)造函數(shù),以及聲明了從ModuleMap中獲取其對象的get_xxx函數(shù)。

在service的最后調(diào)用IMPLEMENT_MODULE,把module注冊到RegistryMap中。

在上下文相關(guān)的session中調(diào)用INJECT_MODULE_DEPENDENCY、INJECT_DATA_MODULE_DEPENDENCY;

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

INJECT_DATA_MODULE_DEPENDENCY用于把data注入到module中。

3.2 代碼回顧

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

到此,關(guān)于“C++反射的實現(xiàn)方法詳解”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
網(wǎng)頁題目:C++反射的實現(xiàn)方法詳解-創(chuàng)新互聯(lián)
URL鏈接:http://www.dlmjj.cn/article/cohhpc.html