C++反射实现(转)
代码以来的库都是C++标准库,所以不需要额外添加库。
例如:
代码片段(3)[全屏查看所有代码]
1. [文件] DynBase.cpp ~ 781B 下载(284)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
#include "StdAfx.h" #include <map> #include "DynBase.h" static std::map< string,ClassInfo*> *classInfoMap = NULL; using namespace std; IMPLEMENT_CLASS(Object) bool Object::Register(ClassInfo* ci) { if (!classInfoMap) { classInfoMap = new std::map< string,ClassInfo*>(); } if (ci) { if (classInfoMap->find(ci->m_className) == classInfoMap->end()){ classInfoMap->insert(std::map< string,ClassInfo*>::value_type(ci->m_className,ci)); } } return true ; } Object* Object::CreateObject(std::string name) { std::map< string,ClassInfo*>::const_iterator iter = classInfoMap->find(name); if (classInfoMap->end() != iter) { return iter->second->CreateObject(); } return NULL; } bool Register(ClassInfo* ci) { return Object::Register(ci); } |
2. [文件] DynBase.h ~ 1KB 下载(267)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
#ifndef __DYNBASE_H__ #define __DYNBASE_H__ #include <string> class Object; class ClassInfo; typedef Object* (*ObjectConstructorFn)( void ); bool Register(ClassInfo* ci); using namespace std; class ClassInfo { public : ClassInfo( const std::string className,ObjectConstructorFn ctor) :m_className(className) ,m_objectConstructor(ctor) { Register( this ); } virtual ~ClassInfo(){} Object* CreateObject() const { return m_objectConstructor ? (*m_objectConstructor)() : 0; } bool IsDynamic() const { return NULL != m_objectConstructor;} const std::string GetClassName() const { return m_className;} ObjectConstructorFn GetConstructor() const { return m_objectConstructor;} public : string m_className; ObjectConstructorFn m_objectConstructor; }; #define DECLARE_CLASS(name) \ protected : \ static ClassInfo ms_classinfo; \ public : \ virtual ClassInfo* GetClassInfo() const ; \ static Object* CreateObject(); #define IMPLEMENT_CLASS_COMMON(name,func) \ ClassInfo name::ms_classinfo((#name), \ (ObjectConstructorFn) func); \ \ ClassInfo *name::GetClassInfo() const \ { return &name::ms_classinfo;} #define IMPLEMENT_CLASS(name) \ IMPLEMENT_CLASS_COMMON(name,name::CreateObject) \ Object* name::CreateObject() \ { return new name;} class Object { DECLARE_CLASS(Object) public : Object(){} virtual ~Object(){} static bool Register(ClassInfo* ci); static Object* CreateObject(string name); }; #endif |
3. [文件] test.cpp ~ 579B 下载(236)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#include<iostream> #include<cstring> #include "DynBase.h" using namespace std; class A : public Object { DECLARE_CLASS(A) public : A(){cout<<hex<<( long ) this << " A constructor!" <<endl;} ~A(){cout<<hex<<( long ) this << " A destructor!" <<endl;} }; IMPLEMENT_CLASS(A) class B : public Object { DECLARE_CLASS(B) public : B(){cout<<hex<<( long ) this << " B constructor!" <<endl;} ~B(){cout<<hex<<( long ) this << " B destructor!" <<endl;} }; IMPLEMENT_CLASS(B) int main() { Object* p = Object::CreateObject( "A" ); delete p; system ( "pause" ); return 0; } |
C++反射实现(转)的更多相关文章
- 隐私泄露杀手锏 —— Flash 权限反射
[简版:http://weibo.com/p/1001603881940380956046] 前言 一直以为该风险早已被重视,但最近无意中发现,仍有不少网站存在该缺陷,其中不乏一些常用的邮箱.社交网站 ...
- Java学习之反射机制及应用场景
前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...
- 关于 CSS 反射倒影的研究思考
原文地址:https://css-tricks.com/state-css-reflections 译者:nzbin 友情提示:由于演示 demo 的兼容性,推荐火狐浏览.该文章篇幅较长,内容庞杂,有 ...
- 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)
建议106:动态代理可以使代理模式更加灵活 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发.我们知道一个静态代理是通过主题角色(Prox ...
- 运用Mono.Cecil 反射读取.NET程序集元数据
CLR自带的反射机智和API可以很轻松的读取.NET程序集信息,但是不能对程序集进行修改.CLR提供的是只读的API,但是开源项目Mono.Cecil不仅仅可以读取.NET程序集的元数据,还可以进行修 ...
- .NET面试题系列[6] - 反射
反射 - 定义,实例与优化 在面试中,通常会考察反射的定义(操作元数据),可以用反射做什么(获得程序集及其各个部件),反射有什么使用场景(ORM,序列化,反序列化,值类型比较等).如果答得好,还可能会 ...
- .NET基础拾遗(4)委托、事件、反射与特性
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- C++的性能C#的产能?! - .Net Native 系列五:.Net Native与反射
此系列系小九的学堂原创翻译,翻译自微软官方开发向导,一共分为六个主题.本文是第五个主题:.Net Native与反射. 向导文链接:<C++的性能C#的产能?! - .Net Native 系列 ...
- [源码]Literacy 快速反射读写对象属性,字段
Literacy 说明 Literacy使用IL指令生成方法委托,性能方面,在调用次数达到一定量的时候比反射高很多 当然,用IL指令生成一个方法也是有时间消耗的,所以在只使用一次或少数几次的情况,不但 ...
- SI与EMI(一) - 反射是怎样影响EMI
Mark为期两天的EMC培训中大概分成四个时间差不多的部分,简单来说分别是SI.PI.回流.屏蔽.而在信号完整性的书籍中,也会把信号完整性分为:1.信号自身传输的问题(反射,损耗):2.信号与信号之间 ...
随机推荐
- TensorFlow 1.4利用Keras+Estimator API进行训练和预测
Tensorflow 1.4中,Keras作为作为核心模块可以直接通过tf.keas进行调用,但是考虑到keras对tfrecords文件进行操作比较麻烦,而将keras模型转成tensorflow中 ...
- 二进制样式的字符串与byte数组互转函数示例
开发时用到的方法,记录下: /// <summary> /// 测试方法 /// </summary> private void TestFun() { Response.Wr ...
- hdu 1241(DFS/BFS)
Oil Deposits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- Realm 简介
是一个跨平台的本地数据库,比sqlite 数据库更轻量级,执行效率更高. 官网地址:https://realm.io/docs/java/latest/
- php项目,别人无法访问自己(windows 系统)上Apache服务器原因(转载)
别人无法访问自己电脑上的Apache服务器,其中最大的原因是因为Windows防火墙的因素. 1.有安装防火墙的,把防火墙关闭 2.windows默认带防火墙的,进入 控制面板-系统和安全-Windo ...
- ruby 基础知识2 - 区块 block
原文 1. block中的 yield 与遍历 5.times do |i| puts i end 或者 def my_times(n) i = 0 while n > i i += 1 yie ...
- mac iterm 提示符序列调整
mac终端提示符显示绝对路径太长了,能不能提示符不显示全路径呢?自定义提示符前缀呢? mac终端命令换行覆盖问题也顺带解决. 编辑~/.bash_profile export PS1='' 参数: 序 ...
- mysql批量更新的两种方式效率试验<二>
Mysql两种批量更新的对比 简介: mysql搭载mybits框架批量更新有两种方式,一种是在xml中循环整个update语句,中间以‘:’隔开,还有一种是使用case when 变相实现批量更新, ...
- Logcat
logcat -- "-s"选项 : 设置输出日志的标签, 只显示该标签的日志; -- "-f"选项 : 将日志输出到文件, 默认输出到标准输出流中, -f 参 ...
- python2,python3同时安装时,python3可以安装并升级pip库,python2报错的解决办法
最近在使用pip安装包的的时候出现下面错误 UnicodeEncodeError: 'ascii' codec can't encode character u'\u258f' 查询资料后发现原因是p ...