c++反射机制(vcl实现),mfc可依样实现
//---------------------------------------------------------------------------
#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可依样实现相关推荐
- windows消息机制-4(MFC)
消息分类与消息队列 Windows中,消息使用统一的结构体(MSG)来存放信息,其中message表明消息的具体的类型, 而wParam,lParam是其最灵活的两个变量,为不同的消息类型时,存放数据 ...
- 哪些类用来实现java反射机制_JAVA反射机制
运行时类型识别(Run-time Type Identification, RTTI)主要有两种方式,一种是我们在编译时和运行时已经知道了所有的类型,另外一种是功能强大的"反射"机 ...
- Java的反射作用_浅析Java 反射机制的用途和缺点
反射的用途 Uses of Reflection Reflection is commonly used by programs which require the ability to examin ...
- C++ 通过模版工厂实现 简单反射机制
前言 我们知道Java/Python这种语言能够很好得 支持反射.反射机制 就是一种用户输入的字符串到对应实现方法的映射,比如http接口中 用户传入了url,我们需要调用该url对应的方法/函数对象 ...
- Golang反射机制的实现分析——reflect.Type方法查找和调用
在<Golang反射机制的实现分析--reflect.Type类型名称>一文中,我们分析了Golang获取类型基本信息的流程.本文将基于上述知识和经验,分析方法的查找和调用.(转载请指明出 ...
- Golang反射机制的实现分析——reflect.Type类型名称
现在越来越多的java.php或者python程序员转向了Golang.其中一个比较重要的原因是,它和C/C++一样,可以编译成机器码运行,这保证了执行的效率.在上述解释型语言中,它们都支持了&quo ...
- Java学习总结:39(反射机制)
反射机制 JAVA中反射是动态获取信息以及动态调用对象方法的一种反射机制. Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属 ...
- OC 的反射机制以及使用场景
OC 的反射机制 一 定义概念 普遍的概念就是类似于java的反射机制,动态机制使得OC语言更加灵活. 反射机制就是可以根据指定的类名获取类的相关信息. 二 作用 1 根据类名获得class // 选 ...
- 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...
最新文章
- linux如何关闭udp端口,如何阻止linux RHEL7中的udp端口范围(How to block udp ports range in linux RHEL7)...
- 1.10 卷积神经网络示例-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
- Deeplearning.ai深度学习课程笔记-在线版
- 第一课 前言 学PHP就是为了做网站
- Linux配置环境变量source时报错:export `=‘ not a valid identifier的一般原因
- 【已解决】Protocol ‘https‘ not on whitelist ‘file,crypto,data‘!
- 2015/8/30 Python基础(4):序列操作符
- mysql 覆盖索引_MySQL 覆盖索引
- 有意义的100个小故事
- 低速硬件接口之RS485接口自收发隔离多节点分享
- 在开发板显示24位的bmp格式图片
- python2读取excel文件_python读取excel文件
- 识别图片上的文字,如何在线识别?
- 如何在Lattice CPLD XO2系列器件中执行TransFR(透明传输)操作?
- HP 5200dtn 打印机错误排错思路
- 四川大学计算机网络期末复习,川大网络教育专科-公共课之计算机文化基础(2015上)期末考试模拟题...
- MySQL基础知识测试,文末领取面试资料
- php 培训ppt_php学习 字符串课件
- 乐高大颗粒作品3:留声机的搭建
- 【Python3】【碎碎念】集合类型,set和frozenset
热门文章
- 配置zabbix监控windows,cmd运行报错cannot connect to Service Manager: [0x00000005]
- vscode解决java无法输入(scanner)问题
- bzoj1188: [HNOI2007]分裂游戏
- socket/WebSocket/WebService/http/https概念
- Matlab R2018a版离线使用帮助文档方法
- ActiveMQ broker 集群, 静态发现和动态发现
- scrapy-redis使用以及剖析
- Part8 多态性 8.2虚函数
- code vs 1026 逃跑的拉尔夫
- ARM7/9 的中断与 RTOS 系统(转)