跟我学c++高级篇——反射

这篇具有很好参考价值的文章主要介绍了跟我学c++高级篇——反射。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、反射的概念

反射和自省,做为静态和动态时的处理的方式,导致的操作手段不尽相同。那么对c++来说,如何能够获取数据类型,在发展到今天,已经不是一个选择题,而是一个必选题。语言要想生存下去,就需要不断的创新和发展,不断的完善和迭代自己,那么做为高级语言中常见的反射,c++也在通过各种手段,在悄悄的补上这一课。直到最后c++标准的引入。
什么是反射(Reflection)?就是反映程序在动态运行时,检测、查寻和修改自身状态或者行为的一种能力。一般来说,通过反射可以获得:
1、指定对象的类型
2、获得相关对象的所有的成员变量和方法(对私有和保护不同的语言可能处理方式略有不同)。
3、动态创建对象。
4、在动态运行时调用相关对象的方法和函数及相关属性。
反射使语言的操作推进到了运行状态,但这不代表反射更加优秀,他也有不少的缺点:
1、性能,反射的过程导致整个运行时的动作会耗费更多的运行时间。
2、降低了可维护性。因为对运行状态期的理解不同,导致可能维护者对代码的理解不同。
3、反射使整体的业务逻辑变得复杂。
正所谓因人施教,因材施教,用得恰到好处,才是真得优秀的编程者。

二、反射的类别和应用场景

反射一般分为动态反射和静态反射两大类。当然在不同的语言中对反射的理解和处理都有些许的不同,需要注意。一般来说,动态语言如Python、c#等处理反射就非常容易,但对于静态语言如C,c++等这种过渡性高级语言,其实处理反射就比较麻烦。但是也不能说静态语言不能处理反射,比如c++可以通过宏或者SFINAE等技术做一些基本的反射动作。
这里要区分动态反射-静态反射和动态语言-动态语言的不同。动态反射多是指在运行期,静态反射多指在编译期,所以它也叫自省。而动态语言和静态语言则是指是否在运行期进行数据类型检查的不同。
反射的主要应用场景如下:
1、序列化和反序列化:这是最常用的场景。如果没有反射,那可麻烦大了。手动自己一个个匹配字节码吧。
2、远程方法RMI的调用,这个有过c#和Java开发经验的会非常容易理解。
3、数据库开发用的O/R Mapping,即对象关系映射。
4、设计模式中的一些应用,如工厂模式等。
5、其它,只要涉及到反射可以得到的类型处理等的情况。
在实现反射的手段中,一般有两种形式,即侵入式和非侵入式,这个通过名字就可以知道哪种效果会更优。

三、c++中的反射

从某种角度来说,c++是不支持反射的。当然,如果严格来说,c++是不支持动态反射的,但是通过一些技术手段可以实现静态反射的效果。这就包括前面学习到的元编程、模板编程(SFINAE)还有宏机制等。但是需要说明的,如果在业务逻辑上通过某种技巧实现类似反射的结果,一般来说,这不能归到反射上去。当然,这个就仁者见仁了。
在早期的c++中,最典型的其实就是MFC中通过模板和宏来生动态生成类并生成类的对象,这其实就是一种反射的应用。而在新的c++20提供了属性,这其实就是一个进步,它其实就可以说对反射的一种支持。c++这种静态语言会不会推出从标准上支持的反射,这个还不敢给出确切的说法(但有可能在c++26或29中支持)。
也就是说,当前的c++标准只是在RTTI(运行期类型识别)仅仅是一个类型的判断处理,简单到了发指。虽然c++20(reflexpr关键字)提供了一些面向未来测试的实现方式,但目前来看,也仅仅是一个结探索,并未真正实现,必须类似的老套的剧情发生过很多次,不断的更新迭代版本,甚至废弃都有可能。

四、总结

其实反射也可以放到模板元编程中来进行分析,但是为了更好的讲解一些c++的高级特性,还是把它分离了出来。c++的许多高级的特性,在国内的大多数应用场景上,其实是应用不到的。原因是,这些高级特性大多是在基础库支持或者基础软件上才用的。而这恰恰是国内的软肋。
知已知彼,百战不殆。看到有什么不足,才能更好的补齐它。共同努力!文章来源地址https://www.toymoban.com/news/detail-431945.html

到了这里,关于跟我学c++高级篇——反射的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【区块链 | Solidity】跟我学 Solidity(7):事件

    如何使用事件记录数据 原文: https://medium.com/better-programming/learn-solidity-events-2801d6a99a92 作者: wissal haji 欢迎订阅《Solidity智能合约零基础开发教程专栏》系列文章。 在今天的文章中,我们将看到如何使用web3.js从区块链中读取事件。 Solidity中的事件就像你习惯于使用其他语

    2024年01月25日
    浏览(52)
  • rust跟我学三:文件时间属性获得方法

                图为RUST吉祥物 大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info是怎样获得杀毒软件的病毒库时间的。 首先,先要了解get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细介绍

    2024年01月17日
    浏览(57)
  • 跟我学java|Stream流式编程——并行流

    并行流是 Java 8 Stream API 中的一个特性。它可以将一个流的操作在多个线程上并行执行,以提高处理大量数据时的性能。 在传统的顺序流中,所有的操作都是在单个线程上按照顺序执行的。而并行流则会将流的元素分成多个小块,并在多个线程上并行处理这些小块,最后将结

    2024年01月25日
    浏览(62)
  • rust跟我学七:获取外网IP地址

                       图为RUST吉祥物 大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info是怎么获取到本机的外网IP地址。 首先,先要了解get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细

    2024年01月19日
    浏览(57)
  • 安全跟我学|网络安全五大误区,你了解吗?

    网络安全 尽管安全问题老生常谈,但一些普遍存在的误区仍然可能让企业随时陷入危险境地。为了有效应对当前层出不穷且不断变换的网络威胁,最大程度规避潜在风险,深入了解网络安全的发展趋势必不可少。即使部署了最新且最先进的硬件和解决方案并严格遵守行业标准

    2024年01月22日
    浏览(56)
  • 【通知】我的教学文章《Rust跟我学》已全部上线

    大家好,我是get_local_info开源库作者带剑书生,现在我的《Rust跟我学》专栏文章已全部上线,它记录了我在写库时获得的重要Rust经验和技巧,是不同于《Rust语言编程》等简单实践的书籍。为您节省了学习时间,让您可以快速上手熟悉Rust并进入项目。 具体介绍,请翻看我的上

    2024年01月20日
    浏览(49)
  • [通知]rust跟我学:文件时间属性获得方法文章已上线

    大家好,我是带剑书生,开源库get_local_info的作者。目前我的付费专栏已经上线第七篇文章,用于介绍在实现get_local_info过程中,遇到该问题所使用的解决方法,喜欢的朋友可以去订阅了,19.9元,非常便宜的价格,做开源不容易。希望能帮助您在学习Rust时,少走弯路,尽快进

    2024年01月17日
    浏览(50)
  • Jmeter 测试 MQ 接口怎么做?跟我学秒变大神!

    MQ(message queue)消息队列,是基础数据结构 先进先出 的一种典型数据结构。一般用来解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。 MQ 主要产品包括:RabbitMQ、ActiveMQ、RocketMQ、ZeroMQ、Kafka MQTT 是轻量的 (Lightweight)、发布订阅模式

    2024年02月06日
    浏览(61)
  • 跟我学Python图像处理丨带你入门OpenGL

    摘要: 介绍Python和OpenGL的入门知识,包括安装、语法、基本图形绘制等。 本文分享自华为云社区《[Python图像处理] 二十七.OpenGL入门及绘制基本图形(一)》,作者:eastmount。 1.什么是OpenGL OpenGL(Open Graphics Library,译为“开放式图形库”) 是用于渲染2D、3D矢量图形的跨语言、

    2024年02月09日
    浏览(60)
  • [通知]rust跟我学八:获取指定目录下的所有文件全路径 已上线

    大家好,我是带剑书生,开源库get_local_info的作者。目前我的付费专栏已经上线,用于介绍在实现get_local_info过程中,遇到该问题所使用的解决方法,喜欢的朋友可以去订阅了,19.9元,非常便宜的价格,做开源不容易。希望能帮助您在学习Rust时,少走弯路,尽快进入项目。

    2024年01月19日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包