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

用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月,据俄罗斯消息报报道,白俄罗斯总统卢卡申科表示国家目前正面临来自西方的安全威胁,自己已经下令白俄部队瞄准西方国家的首都决策中心,如果北约国家敢对白俄的戈梅利等城市动手,白俄车圈热搜中国家庭买车八成不超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分。成绩出来后,北大向他抛出了橄榄枝,邀请他报考北大,除了北大外,还有其他的国内知名大学邀请他报考。然而,面对这么多学校的邀
秋季天气渐冷,预防心梗猝死,这9个指标您都达标了吗?天凉了,最近心梗的人见多,那么如何预防心梗猝死呢?有人说预防心肌梗死说的很复杂,今天我们就把9个最基本的指标分享给大家,如果这9个指标能达标,那么就能大大的降低心肌梗死或猝死的风险硒被称为长寿元素,提醒多吃5种高硒蔬菜,比吃保健品强日常生活中,人们很注重补充维生素钙蛋白质等需求量大的营养物质,却总是遗忘了微量元素硒的补充。硒是什么?它是一种非金属元素,化学符号是Se,在每日膳食营养素供给量指南中,将硒列为15欧国联1威尔士直播吧9月23日讯北京时间9月23日星期五0245,欧国联A4组第5轮比利时对阵威尔士。上半场,巴舒亚伊和德布劳内互相传射建功,比利时半场20领先威尔士。下半场,约翰逊强突助攻,摩李玮峰首秀广州城迎首胜,客胜亚泰三镇保持不败,2022中超第16轮2022年中国平安中国足球超级联赛山东泰山队9月3日星期六1930广州越秀山体育场广州城20天津津门虎主队射手上半场23宋文杰,上半场31宋文杰头比赛进程第23分钟,广州城前场断球出轨队内女性,乌度卡被禁原因找到!名记透露临时主帅已有人选乌度卡被禁赛原因出轨俱乐部内部一名女性职员!先前,凯尔特人主帅乌度卡突然被禁赛,一时间各种吃瓜群众纷至沓来。有的说他使用违禁品的,有的说他打架的,还有的说他是因为跟球队内部出现了矛场均14分,立马离开篮网!只用4场比赛,他就刷出千万合同过去两年的篮网过去两年时间,很多志在夺冠的老将,纷纷选择布鲁克林篮网,因为这支球队,拥有三巨头组合。格里芬和杰夫格林,米尔斯以及阿尔德里奇,当然,还有德拉季奇和德拉蒙德,但最终,球详解中国女排14人名单,三大新星值得期待,仅有一点存在不足文水清清还有两天,女排世锦赛将拉开战幕,今天,中国女排14人大名单出炉,为方便球迷观赛,详解一下大名单,三大新星值得期待,仅有一点存在不足。一四位主攻李盈莹王云蕗和王艺竹。12号李亮出王牌!CBA最大黑马正式打爆广厦,实力或超越辽宁广东?新赛季的CBA联赛还没有开赛,不少球队都在完成了阵容补强之后,纷纷寻找热身赛并尝试尽快进入比赛的状态。球在多支球队的热身赛中,上赛季的亚军广厦男篮与大黑马山东男篮的较量成为了最大的西蒙斯谈被赶出训练我提前告知了里弗斯,但他硬要我打篮网球员本西蒙斯参加JJ雷迪克的节目,谈到了当年被76人主教练道格里弗斯从训练中赶了出去的话题。当时你为什么决定回球队训练两天?雷迪克问西蒙斯。我当时就是希望能尝试做一些正确的事情肌肉男遇到奥尼尔真的会怀疑人生!强森小鸟依人阿诺一脸崇拜肌肉男肯定会很自信,特别是当你拥有完美的肌肉围度,肯定会抓住各种机会来秀自己的肌肉。体坛和娱乐圈的肌肉男很少,体坛的运动员是为了增加对抗,娱乐圈的男明星则是增加自己的魅力,总之,现2年被挖走3条大腿!CBA最惨球队诞生神奇教头能再显神威?闫鹏飞转投上海男篮,这是山西男篮2年内被挖走的第3名主力球员。一年前,山西男篮外线核心超级外援富兰克林与内线主力任骏威,一起转投上海男篮。论主力人员的流失程度,整个CBA最惨的球队