首页 > 编程语言 >C++ 反射实现

C++ 反射实现

时间:2022-11-18 19:23:32浏览次数:42  
标签:std 反射 实现 ptr C++ public ClassMappingObject include class

//  class.h

#ifndef CLASS_H
#define CLASS_H
#include<iostream>
#include<functional>
#include <memory>
#include <map>
#include <stdarg.h>
using namespace std;
class ClassMappingObject
{
    public:
    virtual void classinit()=0;
    virtual ~ClassMappingObject()=default;
};

using RegisterFunc = std::function<std::unique_ptr<ClassMappingObject>()>;
inline std::map<std::string ,RegisterFunc> objectMap;
static void registerObject(const std::string& name,RegisterFunc func) {
    std::cout << "registerObject:" << &objectMap << std::endl;
    objectMap[name] = func;
}

template <typename T>
T* createObject(const std::string& name) {
    for(auto m: objectMap)
    {
        // std::cout<<"keys: "<<m.first<<std::endl;
    }
    if (objectMap.find(name) == objectMap.end()) {
        return nullptr;
    }
    std::cout << "createObject:" << &objectMap << std::endl;
    auto ptr = objectMap[name]();
    // 从基类动态转换为外部需要的类型
    return dynamic_cast<T*>(ptr.release());
}


template <typename T1>
std::unique_ptr<ClassMappingObject> class_make_unique() {
    auto* ptr = new T1;
    return std::unique_ptr<ClassMappingObject>(dynamic_cast<ClassMappingObject*>(ptr));
}

struct RegisterTask {
    RegisterTask( string a) {
        std::cout<<a<<std::endl;
    }
    static string registerfun(const std::string& name,
        std::function<std::unique_ptr<ClassMappingObject>()> func) {
        registerObject(name,func);
        return name;
    }
};

#ifndef REGISTER_CLASS_2
#define REGISTER_CLASS_2(Type)\
static RegisterTask  task##Type(RegisterTask::registerfun(#Type,class_make_unique<Type>));
#endif
#endif
//  F.h
#ifndef F_H
#define F_H
class F
{
    public:
    virtual void fun()=0;
};
#endif

//  Per.h
#include"class.h"
#include"F.h"

class Per:public F,public ClassMappingObject
{
    public:
    void classinit() //实现ClassMappingObject中函数进行初始化
    {
        tem=10;
        std::cout<<"Per classinit"<<std::endl;
    }
    virtual void fun() //实现F中虚函数进行执行业务
    {
        std::cout<<"Per fun:"<<tem<<std::endl;
    }
    private:
        int tem=0;
};

//进行注册
// REGISTER_CLASS(Per);
 REGISTER_CLASS_2(Per)


//  Per1.h
#include"class.h"
#include"F.h"
class Per1:public F,public ClassMappingObject
{
    public:
    void classinit() //实现ClassMappingObject中函数进行初始化
    {
        tem=10;
        std::cout<<"Per1 classinit"<<std::endl;
    }
    virtual void fun() //实现F中虚函数进行执行业务
    {
        std::cout<<"Per1 fun:"<<tem<<std::endl;
    }
    private:
        int tem=0;
};
//进行注册
// REGISTER_CLASS(Per1);
REGISTER_CLASS_2(Per1);

//  Per2.h
#include"class.h"
#include<vector>
#include"F.h"
class Per2 :public F, public ClassMappingObject
{
    public:
        Student(int a=10){tem = a;}
        virtual void fun()
        {
            std::cout<<"Per2 fun"<<tem<<std::endl;
        }
        
    public:
        void classinit()
        {
            tem=80;
            std::cout<<"Per2 classinit"<<std::endl;
        }
    private:
        float tem;

};
// REGISTER_CLASS(Student);
REGISTER_CLASS_2(Student);


//  main.cpp
#include "Per.h"
#include "Per1.h"
#include "Per2.h"
#include "F.h"
int main(int argc, char const *argv[])
{
   /* code */
   F* ptr = createObject<F>("Per");  //获取基类类型,实现多态
   ptr->fun();
   F* ptr1 = createObject<F>("Per1");  //获取基类类型,实现多态
   ptr1->fun();
   return 0;
}

标签:std,反射,实现,ptr,C++,public,ClassMappingObject,include,class
From: https://www.cnblogs.com/xiaohaigegede/p/16904695.html

相关文章

  • 配置实现介绍 快速开发平台
    建立一套基础的系统开发架构,利用XML配置(利用结构化的xml文档配置相关的信息)实现增删改查及业务流程,支持开发人员方便的开发实现客户需求,支持系统实施维护人员对配置实现进行......
  • 配置实现-适易快速开发架构实现功能总结
    马上到年关了,先总结下自己的产品吧。配置实现,自己最初的目标就是利用配置(现在用的是xml配置)实现查询列表、展现、导出及简单的编辑。从2008年积累到现在发现可用通过配置实......
  • 配置实现-自创html生成模板搭配xml获取数据无需写代码实现静态网站
    自创html生成模板搭配xml获取数据无需写代码实现静态网站实际项目:老干部和九重阳网站欢迎访问http://www.laoganbu.orghttp://www.9chongyang.com实现思路:html界面采用自......
  • C#利用js脚本实现配置的文本表达式计算
    usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingMSScriptControl;namespaceMyQuery.CSharpScript{  ///......
  • 配置实现+工作流引擎-OA办公系统开发利器
    OA办公项目的开发离不开工作流程的处理,有工作流处理引擎开发工作就会更加便利,外加利用xml配置实现任务的处理,这样一般的流程就可以实现零编程实现了。建立一个基础的系统架......
  • 配置实现-提升信息管理系统开发效率
    您为信息管理类系统的开发而付出昂贵的财力或人力代价而惋惜吗?您为信息管理类系统的开发因需求不明确或需求的变化而苦恼吗?您为信息管理类系统的开发因都是类似的增删改查的......
  • 配置实现-快速开发实现信息管理系统
    经过3年多的积累,自己基于XML配置实现增删改查,建立了一套基础的系统架构,利用XML配置(利用结构化的xml文档配置相关的信息)实现增删改查及业务流程,支持开发人员方便的开发实现客......
  • 配置实现-适应之道
    总结十年来的开发经验,想到十年前自己开发的医院管理系统,现在还在一些客户处使用(因为没有提供后期的技术支持,有些已经更换了),心里有种喜悦。回想现在能够使用的关键因素在于能......
  • C++编写Time类显示系统时间
    编写Time类,要求:(1)包含年、月、日、时、分、秒的信息。(2)构造函数将类的对象初始化为系统当前时间(使用头文件time.h中的time函数。)(3)能按照标准格式输出对象表示的时间。......
  • 配置实现-解决方案项目介绍
    数据层DAL利用了微软的开源项目GotDotNet.ApplicationBlocks.Data(即ADOHelper),并封装了数据库常用的操作。业务层BAL首先是封装了DAL层数据库的调用(因此要求在WEB层必须调用......