C++ reflection/反射
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/反射相关推荐
- 代替Reflection(反射)的一些方法
Reflection(反射)是深入学习.Net必须掌握的技能之一.最初学Reflection的时候,的确是被惊住了,原来还可以这样.只要给你一个Assembly, 你就能获取到其中所有的类型,根据类型 ...
- PHP的Reflection反射机制
原文地址: http://www.nowamagic.net/php/php_Reflection.php PHP5添加了一项新的功能:Reflection.这个功能使得程序员可以 reverse-e ...
- Java反射机制的基本概念与使用_Java进阶之reflection(反射机制)——反射概念与基础...
反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...
- Reflection 反射
反射的基本概念 正射-实例化 Apple apple=new Apple();//直接初始化[正射] app.setPrice(4); 反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的 ...
- MakeGenericMethod Reflection 反射 ObjectToXmlT Generic XmlSerializer
- Java基础--反射Reflection
Reflection 反射能在运行时获取一个类的全部信息,并且可以调用类方法,修改类属性,创建类实例. 而在编译期间不用关心对象是谁 反射可用在动态代理,注解解释,和反射工厂等地方. -------- ...
- 注解和反射详细笔记。自定义注解,元注解,内置注解。反射机制,Java Reflection,Java内存分析,反射操作注解,java.lang.reflect.Method,Class
文章目录 注解 什么是注解 内置注解 元注解 自定义注解 反射机制 静态语言 vs 静态语言 Java Reflection 反射相关的主要API Class类 Java内存分析 创建运行时类的对象 ...
- 反射(reflection)基础
反射(reflection) 1. 一个需求引出反射 1.1 请看下面的问题 根据配置文件 re.properties 指定信息,创建Cat对象并调用方法hi 我们用之前的方式处理就是: 先创建一个C ...
- java 反射Reflection;Class类
1.反射机制概述 java能够反射的前提:已经加载过这个类 反射可以通过类名来寻找这个类的所有相关信息.类似于人类的记忆,事先在记忆中有了这个事物的信息,人就可以通过名字来在记忆中寻找事物的具体信息. ...
- JavaSE——第23章 反射reflection
JavaSE--第23章 反射reflection(老师:韩顺平) 文章目录 JavaSE--第23章 反射reflection(老师:韩顺平) 23.2 反射机制 23.2.1 Java refle ...
最新文章
- 字符串循环同构的最小表示法(转)
- Java高并发编程:多个线程之间共享数据的方式探讨
- NAND FLASH 和NOR FLASH工作原理
- 【微信小程序】小程序之自定义头部导航栏背景图
- javascript王者归来--属性和方法的类型
- html怎么做交互留言,简单html与servlet交互
- ecshop 函数列表大全
- jstring转换到C语言所用的char
- JS数据结构第五篇 --- 二叉树和二叉查找树
- java开发正则表达式
- 聚类之详解FCM算法原理及应用
- Word失去焦点卡顿,从其他地方回到Word转圈圈
- 北京等保测评机构项目测评收费价格标准参考
- 斐波那契数列(矩阵快速幂)
- pyecharts对于经纬度_echarts 根据经纬度坐标在地图上描点
- 遇到错误: 任务未能使用 SdkToolsPath“”或注册表项“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\NETFXSDK\4.7.2
- C语言实现三子棋游戏(规范化)
- scrapy-selenium-谷歌浏览器爬取带有时效性cookies的网站
- 国密算法(SM2,SM3,SM4)辅助工具升级版(OTP+PBOC3.0)
- Virtual Shard