//---------------------------------------------------------------------------

#pragma hdrstop

#include "untFactory.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//定义一个函数指针TCreateMe
typedef TComponent* (*TCreateMe)(TComponent* Owner);

//保存类信息的结构
struct TMyClassInfo
{
  AnsiString ClassName;
  TCreateMe CreateMe;
  TMyClassInfo(AnsiString const &aClassName,TCreateMe aCreateMe):
        ClassName(aClassName),CreateMe(aCreateMe){}
};

//重载==
bool operator ==(TMyClassInfo const &A,AnsiString const &ClassName)
{
        return A.ClassName==ClassName;
}
//工厂类
class TMyClassFactory
{
  static std::vector<TMyClassInfo> ClassInfo;
  public:
  //注册类函数
  static inline void RegisterClass(AnsiString const &ClassName,
        TCreateMe CreateMe)
  {
        ClassInfo.push_back(TMyClassInfo(ClassName,CreateMe));
  }
  //生成类函数
  static TComponent* CreateObject(AnsiString const &ClassName,TComponent * Owner)
  {
      std::vector<TMyClassInfo>::iterator pos;
      pos=std::find(ClassInfo.begin(),ClassInfo.end(),ClassName);
      if(pos!=ClassInfo.end())
        return pos->CreateMe(Owner);
      return NULL;
  }

static inline void DeleteObject(TComponent* x){delete x;}

};
std::vector<TMyClassInfo> TMyClassFactory::ClassInfo;        //初始化vector

//创建一个类的模板函数
template <typename T>
TComponent* _Class_CreateMe(TComponent* Owner){return new T(Owner);}

//new一个对象的模板函数
template <typename T>
inline T* FactoryCreateObject(AnsiString const &ClassName,TComponent* Owner=NULL)
{
        return (T*)TMyClassFactory::CreateObject(ClassName,Owner);
}

#define FactoryRegisterClass(T) TMyClassFactory::RegisterClass(#T,_Class_CreateMe<T>);

使用方法:

1,注册:FactoryRegister(TForm1);

2,从类名生成实例

TForm *pForm=FactoryCreateobject<TForm>("TForm1",this);

TForm* pForm=(TForm*)TMyClassFactory::CreateObject("TForm1",this);

其实 现在各种类库的rtti基本都已非常完善,只要根据其提供的api即可,这里仅是研究下C++中的模板等用法而已。

c++反射机制(vcl实现),mfc可依样实现相关推荐

  1. windows消息机制-4(MFC)

    消息分类与消息队列 Windows中,消息使用统一的结构体(MSG)来存放信息,其中message表明消息的具体的类型, 而wParam,lParam是其最灵活的两个变量,为不同的消息类型时,存放数据 ...

  2. 哪些类用来实现java反射机制_JAVA反射机制

    运行时类型识别(Run-time Type Identification, RTTI)主要有两种方式,一种是我们在编译时和运行时已经知道了所有的类型,另外一种是功能强大的"反射"机 ...

  3. Java的反射作用_浅析Java 反射机制的用途和缺点

    反射的用途 Uses of Reflection Reflection is commonly used by programs which require the ability to examin ...

  4. C++ 通过模版工厂实现 简单反射机制

    前言 我们知道Java/Python这种语言能够很好得 支持反射.反射机制 就是一种用户输入的字符串到对应实现方法的映射,比如http接口中 用户传入了url,我们需要调用该url对应的方法/函数对象 ...

  5. Golang反射机制的实现分析——reflect.Type方法查找和调用

    在<Golang反射机制的实现分析--reflect.Type类型名称>一文中,我们分析了Golang获取类型基本信息的流程.本文将基于上述知识和经验,分析方法的查找和调用.(转载请指明出 ...

  6. Golang反射机制的实现分析——reflect.Type类型名称

    现在越来越多的java.php或者python程序员转向了Golang.其中一个比较重要的原因是,它和C/C++一样,可以编译成机器码运行,这保证了执行的效率.在上述解释型语言中,它们都支持了&quo ...

  7. Java学习总结:39(反射机制)

    反射机制 JAVA中反射是动态获取信息以及动态调用对象方法的一种反射机制. Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属 ...

  8. OC 的反射机制以及使用场景

    OC 的反射机制 一 定义概念 普遍的概念就是类似于java的反射机制,动态机制使得OC语言更加灵活. 反射机制就是可以根据指定的类名获取类的相关信息. 二 作用 1 根据类名获得class // 选 ...

  9. 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换

    作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...

最新文章

  1. linux如何关闭udp端口,如何阻止linux RHEL7中的udp端口范围(How to block udp ports range in linux RHEL7)...
  2. 1.10 卷积神经网络示例-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  3. Deeplearning.ai深度学习课程笔记-在线版
  4. 第一课 前言 学PHP就是为了做网站
  5. Linux配置环境变量source时报错:export `=‘ not a valid identifier的一般原因
  6. 【已解决】Protocol ‘https‘ not on whitelist ‘file,crypto,data‘!
  7. 2015/8/30 Python基础(4):序列操作符
  8. mysql 覆盖索引_MySQL 覆盖索引
  9. 有意义的100个小故事
  10. 低速硬件接口之RS485接口自收发隔离多节点分享
  11. 在开发板显示24位的bmp格式图片
  12. python2读取excel文件_python读取excel文件
  13. 识别图片上的文字,如何在线识别?
  14. 如何在Lattice CPLD XO2系列器件中执行TransFR(透明传输)操作?
  15. HP 5200dtn 打印机错误排错思路
  16. 四川大学计算机网络期末复习,川大网络教育专科-公共课之计算机文化基础(2015上)期末考试模拟题...
  17. MySQL基础知识测试,文末领取面试资料
  18. php 培训ppt_php学习 字符串课件
  19. 乐高大颗粒作品3:留声机的搭建
  20. 【Python3】【碎碎念】集合类型,set和frozenset

热门文章

  1. 配置zabbix监控windows,cmd运行报错cannot connect to Service Manager: [0x00000005]
  2. vscode解决java无法输入(scanner)问题
  3. bzoj1188: [HNOI2007]分裂游戏
  4. socket/WebSocket/WebService/http/https概念
  5. Matlab R2018a版离线使用帮助文档方法
  6. ActiveMQ broker 集群, 静态发现和动态发现
  7. scrapy-redis使用以及剖析
  8. Part8 多态性 8.2虚函数
  9. code vs 1026 逃跑的拉尔夫
  10. ARM7/9 的中断与 RTOS 系统(转)