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

使用:

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

场景是什么?

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

问题:

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

相关推荐
seven97_top42 分钟前
Tomcat 线程池的设计与实现:StandardThreadExecutor
java·tomcat
Javatutouhouduan1 小时前
大厂Java岗最新面试真题汇总!
java·java面试·后端开发·java编程·java程序员·互联网大厂·java八股文
逻辑驱动的ken1 小时前
Java高频面试考点场景题23
java·开发语言·数据库·面试·职场和发展·哈希算法
xxjj998a1 小时前
PHP vs Java:核心区别与应用场景全解析
java·开发语言·php
2301_789015621 小时前
Linux基础指令(一)
linux·运维·服务器·c语言·开发语言·c++·linux指令
csgo打的菜又爱玩1 小时前
11.JobManager 启动流程总结
大数据·开发语言·qt·microsoft·flink
用户298698530141 小时前
Java 从零生成 Word 文档:段落、图片与表格操作
java·后端
2401_833269301 小时前
Java IO流:从字节到字符的桥梁
java·开发语言
hhzz1 小时前
第1天:初识Python
开发语言·python·学习编程
江沉晚呤时1 小时前
C# 运行时类型创建:深入探索动态类型生成技术
开发语言·c#