所需工具:g++编译器 前言: 本文主要探讨并实现了如何用C++实现类似于.NET & JAVA的反射机制。 探讨: 近由于项目需求,我们需要用C++编写一个脚本执行程序(简而言之,是编写一个脚本执行框架)。但是很不幸的是,C++中并没有一种想相关的机制来仅仅通过一串函数名的字符串来对应执行函数(反射机制)。 举个实际的例子吧: 我现在有这么一个类: TestClassA{ Void func0(); Void func1(); }; 那么我希望在我的mian函数中如果出现 "TestClassA::func0"这样的字样的话 ,我能够通过某种方法真的执行这个函数(注意:不能再编写代码时写死哦~) 其实,C++中也不是真的不支持反射,比如C++11的RTTI中的typeid就有那么一点点萌芽~,但是很可以的是,RTTI的重点在于类型检查,而不是执行具体方法。 废话不多说了,开始正式思路探讨吧。 思路: 我研究了一下JAVA的反射,他们是这样用的 Foo foo = new Foo("这个一个Foo对象!"); Class clazz = foo.getClass(); Method m1 = clazz.getDeclaredMethod("outInfo"); Method m2 = clazz.getDeclaredMethod("setMsg", String.class); Method m3 = clazz.getDeclaredMethod("getMsg"); m1.invoke(foo); m2.invoke(foo, "重新设置msg信息!"); String msg = (String) m3.invoke(foo); System.out.println(msg); (引用地址:http://lavasoft.blog.51cto.com/62575/61002/) 那么我觉得JAVA编译器在编译过程中肯定是对Foo类中的各种成员函数进行了序列化,并把它放到了一个容器中。当我们要反射时,便会从这个容器中去除对应函数的函数指针然后通过回调函数执行。 那么我们的思路应该是: 0 定义一个函数指针,该函数指针应该与我们要反射的函数同类型。 1 创建以一个反射类,该类负责序列化自写类中的方法,并将其放入一个map容器中 2 在main函数运行前,将我们可能被反射的函数进行注册 代码: 0 定义函数指针(当然我们的函数也要写成这样子的) typedef void (TestClassA::*PTRDeclareFunc)(int,int); 1 定义反射类 注意:反射类应该是单例模式;应该有一个静态方法来反射;应该有一个方法来注册; class ReflectAction{ private: mapm_classFuncMap; ReflectAction(){} public: //============================================= static ReflectAction& getFuncInstance(); void getClassFuncByName(string className,int a,int b) { map ::const_iterator iter; iter = m_classFuncMap.find(className) ; if ( iter == m_classFuncMap.end() ) return; else { TestClassA *q = new TestClassA; PTRDeclareFunc p = iter->second; (q->*p)(a,b); } return ; } //============================================= void registClassFunc(string name, PTRDeclareFunc method) { m_classFuncMap.insert(pair (name, method)) ; } }; ReflectAction& ReflectAction::getFuncInstance(){ static ReflectAction sigleClass; return sigleClass;} 2 为我们书写的类进行注册 (我们用宏的方式来代替手动书写,这样比较节省书写时间) 注意:__attribute((constructor))该关键字指该函数在main函数执行前运行 #define REGISTER(className,funcName) __attribute((constructor)) void before_main##className##funcName() { ReflectAction::getFuncInstance().registClassFunc(#className#funcName,className::funcName); } 使用方法是: REGISTER(TestClassA,m_func); 3 我们自己的类是: class TestClassA{ public: void m_func(int a,int b); }; void TestClassA::m_func(int a,int b){ cout<<"hello TestClassA" << a << b <
卢卡申科白俄已瞄准北约国家首都,普京援助的核武器也将用上7月3月,据俄罗斯消息报报道,白俄罗斯总统卢卡申科表示国家目前正面临来自西方的安全威胁,自己已经下令白俄部队瞄准西方国家的首都决策中心,如果北约国家敢对白俄的戈梅利等城市动手,白俄车圈热搜中国家庭买车八成不超20万特斯拉发布Q2销量六月销量已经出炉,在新能源领域,小鹏取得了半程冠军。但前几天一辆小鹏P7在遇到撞击后,出现了气囊并未弹出的情况,厂家给出撞击力度不够,这样的答复你怎么看?特斯拉也发布了Q2季度的销北约拉拢亚太国家意在制造地区分裂日本韩国澳大利亚和新西兰四国领导人日前参加在西班牙马德里举行的北约峰会,这是北约首次邀请亚太国家参加峰会。虽然这四个被北约称为亚太伙伴的国家目前还无法与北约展开实质性防务合作,但四外媒关注西方国家竞相以加息遏制通胀据路透社7月1日报道,挪威和瑞典也加入了央行选择加息50个基点的国家行列,开始采取它们20年来最大幅度的政策紧缩举措。6月,美联储加息75个基点,瑞士国民银行出人意料地加息0。5个苏联解体后私有化是怎样洗劫国家和国民的30年前,随着加盟共和国的一个一个独立,以最后戈尔巴乔夫的辞职为标志,苏联解体并且把国家权力交给俄罗斯,成为了一个独而不联的独联体组织,现在这个独联体早已名存实亡了。苏联解体后的经两优一先先进典型是飘扬的旗,是挺立的树工作中的C919研制团队。资料图片刘永坦院士(右二)在实验室忙碌。资料图片和学生们在一起的山村教师支月英。资料图片2022年5月14日,中国商飞公司即将交付首家用户的首架C919大新时代推进国家治理现代化的四重维度来源新华日报原标题新时代推进国家治理现代化的四重维度国家治理现代化是继工业现代化农业现代化国防现代化和科学技术现代化之后,中国共产党在社会主义现代化建设问题上的又一规律性认识成果。俄议员美国将卫星数据转交乌克兰是对俄侵略行为据俄罗斯卫星社莫斯科7月4日报道,俄罗斯国家杜马统一俄罗斯党议员奥列格莫罗佐夫表示,有必要在所有国际平台上宣布,美国向乌克兰提供用于军事行动的卫星数据,这是对俄罗斯的侵略。报道称,丹麦警方没有迹象表明哥本哈根购物中心枪击案是恐怖事件据丹麦广播电视台报道,当地时间7月4日8时,哥本哈根警方就购物中心发生的枪击案再次召开新闻发布会。警方表示,没有任何迹象表明哥本哈根的枪击事件是恐怖事件,也没有迹象表明枪击案背后还天津港四变面朝渤海,心向远洋。2019年1月17日,习近平总书记在天津港考察时强调,经济要发展,国家要强大,交通特别是海运首先要强起来。要志在万里,努力打造世界一流的智慧港口绿色港口,更好服男孩高考652分收到北大邀请拒绝,坚定选择人大这是父亲的母校2022年6月高考,一位名叫包家骏的内蒙古考生考了652分。成绩出来后,北大向他抛出了橄榄枝,邀请他报考北大,除了北大外,还有其他的国内知名大学邀请他报考。然而,面对这么多学校的邀