国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++反射的一種實現方法詳解

2020-01-26 13:26:48
字體:
來源:轉載
供稿:網友

一、注冊輔助類

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函數。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 松江区| 历史| 庄河市| 乐平市| 吉木萨尔县| 连江县| 沁阳市| 抚顺县| 宁陵县| 绥阳县| 边坝县| 合阳县| 鹤庆县| 台南市| 楚雄市| 包头市| 渭南市| 菏泽市| 永丰县| 贞丰县| 陆良县| 万载县| 扎鲁特旗| 柯坪县| 东兴市| 大港区| 中西区| 敖汉旗| 昌乐县| 宜兰县| 保亭| 扬中市| 大足县| 济宁市| 福贡县| 兴义市| 江川县| 大同县| 望城县| 周至县| 东城区|