范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

用C实现反射机制

  所需工具: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:
  map m_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次背叛甄嬛,次次致命,甄嬛一次都没有察觉,还一直相信她一入宫门深似海,从此萧郎是路人,面对秀女大选,甄嬛始终无法摆脱进宫的命运,尽管已经极力的收敛锋芒,却还是因那张像极了已逝纯元皇后的脸庞而入选。在后宫的尔虞我诈,一次次的勾心斗角中,我对RNG深感遗憾,拳头没做好!Faker公开发声,管泽元力挺T1前言就在5月15日晚上,英雄联盟T1上单宙斯第一视角曝光出来,大家赫然发现右上角的延迟数字是22ms,这让不少LPL水友直接炸锅。因为之前官方宣称线上和线下都是35延迟,后来因为R超10万台特斯拉紧急大规模召回据国家市场监督管理总局最新公告,特斯拉(上海)有限公司根据缺陷汽车产品召回管理条例和缺陷汽车产品召回管理条例实施办法的要求,向国家市场监督管理总局备案了召回计划。自2022年5月2服用二甲双胍的时候,有什么需要注意的事?这里告诉你二甲双胍是一个老药,自从1921年第一次被人类成功合成之后,在近100年的时间内,一直活跃在治疗糖尿病的第一线。虽然治疗糖尿病的各种新药被层出不穷的发明,但二甲双胍的霸主地位从未动男性生育力不行不是面子问题!给想生娃的你支一招国际著名生殖医学家胚胎学家,第二代第三代试管婴儿技术开拓者之一刘家恩博士曾说过一句话男女在生育方面是不平等的。虽然博士这句话是从男女双方的生理构造出发,但在社会层面,大部分人对生育狗仔也内卷?内娱ampampquot5大天王ampampquot捅出来的瓜,毁掉了娱乐圈的半边天能让内娱明星闻风丧胆的职业,有且只有一个。讲好听点,他们叫娱乐八卦记者。说难听点,叫狗仔。这个称呼起源于香港,港星们一出现,香港的娱乐记者就喜欢冲上前去。闪光灯,询问,以刁钻的角度1勺猪油等于5副药?猪油是心血管杀手还是有利健康?看本文揭秘还是回家好啊!这饭菜都比自己炒的香!妈,有什么秘诀传授给我呗!小李一边往嘴里塞菜,一边跟李老太太说道。你呀!就是嘴贫!李老太太看到许久未见的儿子,高兴得合不拢嘴,能有什么秘诀呀?就建议中老年人,如果不差钱,尽量多吃5种食物,强过天天吃保健品中老年人健康饮食就是要做到吃得好吃得营养吃得全面吃得对!蓉儿建议中老年人如果经济允许,尽量多吃这5种食物,腰腿强壮,营养又健康!1鸡蛋推荐食谱蛋饺食材8个鸡蛋200克猪肉1个白萝卜让人像体验更进一步,vivoS15系列时刻定格最美瞬间如果要问自拍体验哪个系列最有话语权?那么vivoS系列定是最好的答案。但如果要问人像拍摄体验哪款机型更好?那么全新的vivoS15系列定是一个不错的选择。近日,vivo官方更新动态全球3大著名预言家,对2022年做出14大预言,真的可信吗?说起预言,这每个人都有每个人的预言方法,就比如印度神童阿南德,他预言的方式就是利用印度古老的占星术,也就是我们人们口中传统的吠陀占星术,再比如马来西亚的预言家拿督郑博见,他预言的方
爵士阵容雄厚轻松拿捏灰熊!目标直指季后赛,安吉是老狐狸新赛季开始后,爵士队在西部强势崛起,各队对这支劲旅的表现都严重准备不足,在交易走米切尔和戈贝尔后,老狐狸安吉曾明确表示爵士队要在新赛季争取夺得高顺位的选秀轮次,可当他们排在西部第三螺旋圆舞曲2蔷薇战争剧情是什么螺旋圆舞曲2剧情解析这个游戏是最近才出来的一个比较有意思的换装类的游戏,这个游戏的故事剧情特别精彩,引得不少玩家在找螺旋圆舞曲2蔷薇战争剧情是什么。这个游戏的用不同的方式诉说了一个灰姑娘的故事,用细腻旺季不旺!骨折清库存,补货上架慢,美西热门仓库还着火了文章来源公众号跨境物流情报局SMF3仓库着火了!消息来源于3天前的亚马逊员工论坛,来看看SMF3的员工都是怎么说的。昨天SMF3又反应压实机连续2天着火。根据仓库员工的反应来看,火快乐,还是烦恼,其实就在一念之间头号解忧馆很多时候,我们不快乐,只是因为心里太执着,放不下执念,才会在心里纠缠,别总是为了一些小事,惹得自己特别心烦。快乐,还是烦恼,其实就在一念之间,生命不过是一场过程,总是纠结关羽扮演者陆树铭走了,再见美髯公,心中云长也只有他了陆树铭的成就在于在所有人心目中达成了对关羽形象刻画的认知。94年以后,日本游戏公司基本按陆版修改的三国系列关羽头像。以94版本为原型设计的关羽雕塑。今天的手办。18年欧美发布全战三AG梦泪摊上事了,河南老师事件让他被迫停播,真的太冤了最近AG超玩会的梦泪摊上事了。可能不少小伙伴都刷到了一则新闻,河南的一位老师因为被网暴,突发心梗去世。刘老师的女儿放出了一段网课的录屏,当时有几个人在课堂上辱骂老师,言语非常难听,什么样的人才会组团攻击网课老师?一个认真备课上课的女老师,疑似被网暴致死了。这件听起来就很魔幻的事情,就发生在最近。11月2日,一名网友在微博发文,称自己的妈妈是某中学的一名历史老师,10月中旬开始,学校开始网络马斯克最近收购Twitter导致了狗狗币的巨大波动,它会持续多久?自2022年5月市场崩盘以来,加密空间一直受到空头的严重影响。比特币价格下跌了一半以上,同时拉低了其他流行的山寨币。另一方面,狗狗币被推测已经死了,因为它保持了一年多的停滞趋势。然第四届世界智能汽车年度车型评价实车测试在京举行中青报中青网见习记者王志远智能网联汽车是全球汽车产业转型升级的战略方向,在过去的几年里,中国汽车行业在这条赛道上赢得了先机。汽车智能化的不断提高,也带动了全产业链的智能科技创新,从全世界关注美国利率新动向来源环球时报环球时报记者倪浩环球时报驻德国特约记者昭东美联储定于11月2日公布最新利率决议,这是美国11月8日中期选举前美联储最后一次利率调整会议。市场普遍预期美联储将加息75个基融云出海白皮书免费看巴西成增量潜力应许之地在全球化的大旗下,中国互联网出海经历了不同地区的价值迁徙,完成着在新兴市场如东南亚建立信心后,到成熟市场如美国的进阶。关注融云全球互联网通信云了解更多2022社交泛娱乐出海白皮书纵