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

最近在做AI信息在各个平台流转的框架设计,想要设计一种可以灵活扩展、不改变原有代码的框架,了解到了类注册。

具体需求是这样的:AI算法在客户本地电脑和云端都有部署,原先AI在这两个平台下的输出格式并不统一,且每个AI功能都有自己的输出格式,导致两个平台下的AI信息无法共享,带来了计算资源的浪费,管理起来也比较混乱,因此需要一种模式将所有AI输出规范起来。

我的解决思路大概就是将所有AI信息都规范输出到同一个json里面,具体实现就是:定义一个基类,该基类有两个方法需要重载,一个是toJson用于序列化到json,一个是fromJson用于从json中解析,后续每个AI功能的输出都要继承该基类,最后用一个Manager类通过map数据结构管理所有的AI信息。

注册类机制模板实现:

考虑到便于后续AI输出功能的灵活扩展,以及不改变原有代码,用到了类注册机制管理这些子类的创建,最后将类注册机制抽象为如下模板:

cpp 复制代码
// pluginFactoryTemplate.h
#ifndef PLUGIN_FACTORY_TEMPLATE_H_
#define PLUGIN_FACTORY_TEMPLATE_H_

#include<map>

#define REGISTER_PLUGIN(Base,DerivedBase,pluginName) \
    static bool regPlugin_##pluginName=(PluginFatoryTemplate<Base>::register_plugin<DerivedBase>(pluginName),true);

#define REGISTER_PLUGIN(Base,DerivedBase) \
    static bool regPlugin_##DerivedBase=(PluginFatoryTemplate<Base>::register_plugin<DerivedBase>(#DerivedBase),true);

#define CREATE_PLUGIN(Base,pluginName) \
    PluginFatoryTemplate<Base>::create(pluginName)

template<typename Base>
class PluginFatoryTemplate{
    public:
    // 创建函数类型
    using CreateFunc=Base* (*)();
    
    // 注册插件
    template<typename DerivedBase>
    static void register_plugin(const std::string& pluginName){
        getRegistry()[pluginName]=[](){
            return (Base*) (new DerivedBase());
        };
    }

    // 创建插件实例
    static std::shared_ptr<Base> create(const std::string& pluginName){
        auto it=getRegistry().find(pluginName);
        if(it!=getRegistry().end()){
            return std::shared_ptr<Base>(it->second());
        }
        std::cout<<"Error:Can't find "<<pluginName<<std::endl;
        return nullptr;
    }

    private:
    static std::map<std::string,CreateFunc>& getRegistry(){
        static std::map<std::string,CreateFunc> registry;
        return registry;
    }
}
#endif

使用:

定义基类:

cpp 复制代码
// BaseAIOutput.h

class BaseAIOutput{
    public:
    visual std::string toJson()=0;
    visual void fromJson(std::string json)=0;
}

定义子类:

cpp 复制代码
// AI1Output.h
#include"BaseAIOutput.h"

class AI1Output:public BaseAIOutput{
    public:
    virsual std::string toJson();
    virsual void fromJson(std::string json);
}
cpp 复制代码
// AI1Output.cpp
#include"AI1Output.h"
#include"pluginFatoryTemplate.h"

// 注册子类
REGISTER_PLUGIN(BaseAIOutput,AI1Output)

std::string AI1Output::toJson(){
    return "this is json";
}

void AI1Output::fromJson(std::string json){
    std::cout<<"from json"<<std::endl;
}

主函数:

cpp 复制代码
// main.cpp

#include"BaseAIOutput.h"
#include"pluginFatoryTemplate.h"

void main(){
    // 创建子类对象
    auto ptrAI1Output=CREATE_PLUGIN(BaseAIOutput,"AI1Output");
    
    return 0;
}
相关推荐
User_芊芊君子3 分钟前
CANN大模型推理加速引擎ascend-transformer-boost深度解析:毫秒级响应的Transformer优化方案
人工智能·深度学习·transformer
zmzb01034 分钟前
C++课后习题训练记录Day98
开发语言·c++
念风零壹36 分钟前
C++ 内存避坑指南:如何用移动语义和智能指针解决“深拷贝”与“内存泄漏”
c++
智驱力人工智能41 分钟前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
qq_1601448744 分钟前
亲测!2026年零基础学AI的入门干货,新手照做就能上手
人工智能
Howie Zphile1 小时前
全面预算管理难以落地的核心真相:“完美模型幻觉”的认知误区
人工智能·全面预算
人工不智能5771 小时前
拆解 BERT:Output 中的 Hidden States 到底藏了什么秘密?
人工智能·深度学习·bert
盟接之桥1 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
kfyty7251 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
h64648564h1 小时前
CANN 性能剖析与调优全指南:从 Profiling 到 Kernel 级优化
人工智能·深度学习