1. 先看一下什么叫reflecton

wiki上的定义: In computer science, reflection is the ability of a process to examine, introspect, and modify its own structure and behavior.

简单地说,就是可以通过名字调用函数,访问对象。而我们有一个对象,可以反推出其类型、成员/方法、成员/方法的类型。

很多编程语言都与该特性,如Java、Python

Method method = foo.getClass().getMethod("doSomething", null);
method.invoke(foo, null);

这里有简单明了的解释。

2. C++为什么没有reflection

我的理解:reflection 需要编译时保存类型定义信息,即使一个类型只定义而没有使用,这将导致编译后的文件过大,执行速度变慢,与C++的设计理念不符。

stackoverflow上大佬说:

  • 不是C++委员会工作的优先事项,还有其他更高优先级的事情要做;
  • 大多数时候C++不需要使用refection, 不需要为不用的东西付出代价
  • 编译器需要保存所有定义的类型信息...
  • 考虑C++中的模板, 每个特例都是一个单独类型, 有时候模板类知道用到的时候才特例化,可能在运行的时候不存在

3. C++有哪些实现refection的方法

即使C++语言标准不支持refection,也有一些tricky的方法能实现refection

如:

https://gracicot.github.io/reflection/2018/04/03/reflection-present.html
https://github.com/apolukhin/magic_get

4. 应用举例

获取自定义结构体的字段个数

template <class T, std::size_t I0, std::size_t... I>
constexpr auto detect_fields_count(std::size_t& out, std::index_sequence<I0, I...>)-> decltype( T{ ubiq_constructor<I0>{}, ubiq_constructor<I>{}... } )
{ out = sizeof...(I) + 1;      /*...*/ }template <class T, std::size_t... I>
constexpr void detect_fields_count(std::size_t& out, std::index_sequence<I...>) {detect_fields_count<T>(out, std::make_index_sequence<sizeof...(I) - 1>{});
}

C++ 有关键字std::typeid 操作符可以获取一个(表达式)类型的信息。

Ref:

https://en.wikipedia.org/wiki/Reflection_(computer_programming)

https://www.quora.com/What-does-reflection-in-a-programming-language-mean-in-simple-words

https://stackoverflow.com/questions/359237/why-does-c-not-have-reflection/359462

C++ reflection/反射相关推荐

  1. 代替Reflection(反射)的一些方法

    Reflection(反射)是深入学习.Net必须掌握的技能之一.最初学Reflection的时候,的确是被惊住了,原来还可以这样.只要给你一个Assembly, 你就能获取到其中所有的类型,根据类型 ...

  2. PHP的Reflection反射机制

    原文地址: http://www.nowamagic.net/php/php_Reflection.php PHP5添加了一项新的功能:Reflection.这个功能使得程序员可以 reverse-e ...

  3. Java反射机制的基本概念与使用_Java进阶之reflection(反射机制)——反射概念与基础...

    反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...

  4. Reflection 反射

    反射的基本概念 正射-实例化 Apple apple=new Apple();//直接初始化[正射] app.setPrice(4); 反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的 ...

  5. MakeGenericMethod Reflection 反射 ObjectToXmlT Generic XmlSerializer

  6. Java基础--反射Reflection

    Reflection 反射能在运行时获取一个类的全部信息,并且可以调用类方法,修改类属性,创建类实例. 而在编译期间不用关心对象是谁 反射可用在动态代理,注解解释,和反射工厂等地方. -------- ...

  7. 注解和反射详细笔记。自定义注解,元注解,内置注解。反射机制,Java Reflection,Java内存分析,反射操作注解,java.lang.reflect.Method,Class

    文章目录 注解 什么是注解 内置注解 元注解 自定义注解 反射机制 静态语言 vs 静态语言 Java Reflection 反射相关的主要API Class类 Java内存分析 创建运行时类的对象 ...

  8. 反射(reflection)基础

    反射(reflection) 1. 一个需求引出反射 1.1 请看下面的问题 根据配置文件 re.properties 指定信息,创建Cat对象并调用方法hi 我们用之前的方式处理就是: 先创建一个C ...

  9. java 反射Reflection;Class类

    1.反射机制概述 java能够反射的前提:已经加载过这个类 反射可以通过类名来寻找这个类的所有相关信息.类似于人类的记忆,事先在记忆中有了这个事物的信息,人就可以通过名字来在记忆中寻找事物的具体信息. ...

  10. JavaSE——第23章 反射reflection

    JavaSE--第23章 反射reflection(老师:韩顺平) 文章目录 JavaSE--第23章 反射reflection(老师:韩顺平) 23.2 反射机制 23.2.1 Java refle ...

最新文章

  1. 字符串循环同构的最小表示法(转)
  2. Java高并发编程:多个线程之间共享数据的方式探讨
  3. NAND FLASH 和NOR FLASH工作原理
  4. 【微信小程序】小程序之自定义头部导航栏背景图
  5. javascript王者归来--属性和方法的类型
  6. html怎么做交互留言,简单html与servlet交互
  7. ecshop 函数列表大全
  8. jstring转换到C语言所用的char
  9. JS数据结构第五篇 --- 二叉树和二叉查找树
  10. java开发正则表达式
  11. 聚类之详解FCM算法原理及应用
  12. Word失去焦点卡顿,从其他地方回到Word转圈圈
  13. 北京等保测评机构项目测评收费价格标准参考
  14. 斐波那契数列(矩阵快速幂)
  15. pyecharts对于经纬度_echarts 根据经纬度坐标在地图上描点
  16. 遇到错误: 任务未能使用 SdkToolsPath“”或注册表项“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\NETFXSDK\4.7.2
  17. C语言实现三子棋游戏(规范化)
  18. scrapy-selenium-谷歌浏览器爬取带有时效性cookies的网站
  19. 国密算法(SM2,SM3,SM4)辅助工具升级版(OTP+PBOC3.0)
  20. Virtual Shard

热门文章

  1. 赛门铁克完成收购Blue Coat 重塑未来网络安全
  2. 寻租——乞丐没有白拿施舍
  3. jsp+css实现图片自动轮换
  4. Linux学习笔记精华总结(选自鸟哥的Linux私房菜)
  5. oracle 中符号%3e,Oracle数据类型-----(数字格式)
  6. 克里金方法内插生成高程曲面
  7. thermal系列(4)-Thermal Core框架
  8. 高仿QQ游戏大厅-支持换肤和控件切换动画
  9. 安装U8后服务器开机加载信息慢,用友U8 安装ADSL后,连接服务器非常慢
  10. 【阿里网盘】深度学习与Pytorch视频教程