基于C++的反射功能

需求:

利用C++的发射机制,实现根据字符串创建实例对象。

代码:

复制代码
#ifndef OBJECT_H
#define OBJECT_H

#include <string>
#include <map>

typedef void* (*Constructor)();

class CObjectFactory
{
public:
    static void registerClass(std::string className, Constructor constructor)
    {
        constructors()[className] = constructor;
    }

    static void* createObject(const std::string& className)
    {
        Constructor constructor = NULL;

        if(constructors().find(className) != constructors().end())
            constructor = constructors().find(className)->second;

        if ( constructor == NULL )
            return NULL;

        return (*constructor)();
    }

private:
    inline static std::map<std::string, Constructor>& constructors()
    {
        static std::map<std::string, Constructor> instance;
        return instance;
    }
};


#define REGISTER_CLASS(class_name) \
class class_name##Helper { \
public: \
    class_name##Helper() \
    { \
        CObjectFactory::registerClass(#class_name, class_name##Helper::creatObjFunc); \
    } \
    static void* creatObjFunc() \
    { \
        return new class_name; \
    } \
}; \
class_name##Helper class_name##helper;


#endif

使用:

类实现的时候,进行注册。

场景是什么?

类似与这种流程图,有很多算子,我在注册的时候,将算子的类名作为参数,拖拽结束后,获取类名字符串,自动创建对象。

问题:

构造的时候,没办法传参。

相关推荐
叼烟扛炮2 分钟前
C++ 知识点22 函数模板
开发语言·c++·算法·函数模版
~|Bernard|3 分钟前
四,go语言中GMP调度模型
java·前端·golang
Tisfy5 分钟前
LeetCode 2553.分割数组中数字的数位:模拟(maybe+翻转)——java也O(1)
java·数学·算法·leetcode·题解·模拟·取模
怪祝浙6 分钟前
从简单项目入手Java(学生系统)V6(Web版本 Spring Boot3 MySQL Vue3 MyBatis)
java·spring boot·mysql
求学中--16 分钟前
鸿蒙网络请求从入门到精通:HttpURLConnection+第三方库,GET/POST/文件上传全覆盖
开发语言·php·harmonyos
吴声子夜歌17 分钟前
Java——Integer与二进制算法
java·算法
yaodong51821 分钟前
Gemini长上下文重塑RAG架构
开发语言·php
风味蘑菇干23 分钟前
继承 + static + final 综合应用
java·开发语言
IT策士25 分钟前
Python 面试系列:常见 100 个经典面试问题,从入门到进阶
开发语言·python·面试
￰meteor26 分钟前
【移动语义与移动构造】
c++