基于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 小时前
JS 底层探究-- 事件循环
开发语言·前端·javascript
W_LuYi1852 小时前
手撸极简zkEVM验证器:RISC-V电路实践
java·risc-v
asdfg12589632 小时前
C 语言中产生伪随机数的标准做法
c语言·开发语言
玖玥拾2 小时前
C/C++ 基础笔记(十一)类的进阶
c语言·c++·设计模式·
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题 第102题】【并发篇】第2题:volatile 能否保证线程安全?
java·安全·面试
KobeSacre2 小时前
JUC 概述
java·开发语言
-森屿安年-2 小时前
1137. 第 N 个泰波那契数
c++·动态规划
小bo波3 小时前
形式化方法 × UML
java·软件工程·uml·面向对象·形式化方法·tla+
Jun6263 小时前
QT(2)-通过管道关联CMD
开发语言·qt·命令模式
程序员老舅3 小时前
从内核视角,看Linux文件读写过程
linux·服务器·c++·内核·linux内核·vfs·linux内存