基于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

使用:

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

场景是什么?

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

问题:

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

相关推荐
XMYX-0几秒前
27 - Go string 字符串处理与格式化:从底层原理到工程实践
开发语言·golang
赏金术士4 分钟前
Kotlin 协程面试题大全(Android 高频版)
android·开发语言·kotlin
带刺的坐椅6 分钟前
Spring AI 2.0 GA 倒计时:先别急,来看看 Java AI 框架的另一条路
java·spring·ai·llm·agent·solon
烟雨江南aabb11 分钟前
Python第四弹:python进阶-匿名函数和内置函数
开发语言·python
智者知已应修善业17 分钟前
51单片机4按键控制共阳LED霓虹灯切换1整体闪烁2流水下3流水上4间隔闪烁】2023-10-27
c++·经验分享·笔记·算法·51单片机
不瘦80斤不改名21 分钟前
JavaScript 基础语法完全指南
开发语言·javascript·ecmascript
洛水水22 分钟前
结构性设计模式详解
c++·设计模式
TE-茶叶蛋28 分钟前
Java 8 引入的Stream API-stream()
java·windows·python
小陈的进阶之路29 分钟前
Python系列课(9)——面向对象
开发语言·python
Stream_Silver30 分钟前
【 libusb4java实战:跨平台USB设备通信完全指南】
java·笔记·嵌入式硬件·microsoft