[C++技能提拔]类注册

打印 上一主题 下一主题

主题 972|帖子 972|积分 2918

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近在做AI信息在各个平台流转的框架设计,想要设计一种可以灵活扩展、不改变原有代码的框架,了解到了类注册。
详细需求是如许的:AI算法在客户本地电脑和云端都有部署,原先AI在这两个平台下的输出格式并不同一,且每个AI功能都有自己的输出格式,导致两个平台下的AI信息无法共享,带来了计算资源的浪费,管理起来也比力杂乱,因此需要一种模式将全部AI输出规范起来。
我的解决思路大概就是将全部AI信息都规范输出到同一个json里面,详细实现就是:定义一个基类,该基类有两个方法需要重载,一个是toJson用于序列化到json,一个是fromJson用于从json中解析,后续每个AI功能的输出都要继续该基类,最后用一个Manager类通过map数据结构管理全部的AI信息。
注册类机制模板实现:

思量到便于后续AI输出功能的灵活扩展,以及不改变原有代码,用到了类注册机制管理这些子类的创建,最后将类注册机制抽象为如下模板:
  1. // pluginFactoryTemplate.h
  2. #ifndef PLUGIN_FACTORY_TEMPLATE_H_
  3. #define PLUGIN_FACTORY_TEMPLATE_H_
  4. #include<map>
  5. #define REGISTER_PLUGIN(Base,DerivedBase,pluginName) \
  6.     static bool regPlugin_##pluginName=(PluginFatoryTemplate<Base>::register_plugin<DerivedBase>(pluginName),true);
  7. #define REGISTER_PLUGIN(Base,DerivedBase) \
  8.     static bool regPlugin_##DerivedBase=(PluginFatoryTemplate<Base>::register_plugin<DerivedBase>(#DerivedBase),true);
  9. #define CREATE_PLUGIN(Base,pluginName) \
  10.     PluginFatoryTemplate<Base>::create(pluginName)
  11. template<typename Base>
  12. class PluginFatoryTemplate{
  13.     public:
  14.     // 创建函数类型
  15.     using CreateFunc=Base* (*)();
  16.    
  17.     // 注册插件
  18.     template<typename DerivedBase>
  19.     static void register_plugin(const std::string& pluginName){
  20.         getRegistry()[pluginName]=[](){
  21.             return (Base*) (new DerivedBase());
  22.         };
  23.     }
  24.     // 创建插件实例
  25.     static std::shared_ptr<Base> create(const std::string& pluginName){
  26.         auto it=getRegistry().find(pluginName);
  27.         if(it!=getRegistry().end()){
  28.             return std::shared_ptr<Base>(it->second());
  29.         }
  30.         std::cout<<"Error:Can't find "<<pluginName<<std::endl;
  31.         return nullptr;
  32.     }
  33.     private:
  34.     static std::map<std::string,CreateFunc>& getRegistry(){
  35.         static std::map<std::string,CreateFunc> registry;
  36.         return registry;
  37.     }
  38. }
  39. #endif
复制代码
使用:

定义基类: 
  1. // BaseAIOutput.h
  2. class BaseAIOutput{
  3.     public:
  4.     visual std::string toJson()=0;
  5.     visual void fromJson(std::string json)=0;
  6. }
复制代码
定义子类:
  1. // AI1Output.h
  2. #include"BaseAIOutput.h"
  3. class AI1Output:public BaseAIOutput{
  4.     public:
  5.     virsual std::string toJson();
  6.     virsual void fromJson(std::string json);
  7. }
复制代码
  1. // AI1Output.cpp
  2. #include"AI1Output.h"
  3. #include"pluginFatoryTemplate.h"
  4. // 注册子类
  5. REGISTER_PLUGIN(BaseAIOutput,AI1Output)
  6. std::string AI1Output::toJson(){
  7.     return "this is json";
  8. }
  9. void AI1Output::fromJson(std::string json){
  10.     std::cout<<"from json"<<std::endl;
  11. }
复制代码
 主函数:
  1. // main.cpp
  2. #include"BaseAIOutput.h"
  3. #include"pluginFatoryTemplate.h"
  4. void main(){
  5.     // 创建子类对象
  6.     auto ptrAI1Output=CREATE_PLUGIN(BaseAIOutput,"AI1Output");
  7.    
  8.     return 0;
  9. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

拉不拉稀肚拉稀

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表