C语言的VC开发环境界面介绍,【c语言在vc++6.0中编写界面程序】

f15f7aaf0c885db055d161c8f27f6c6f.png

到现在为止,C++ 仍然是计算机编程领域的经典语言之一,C++ 17 标准在2017上半年已经探讨确定。本期我们汇集了编程专家——祁宇(《深入应用 C++ 11》作者,C++ 开源社区 purecpp.org 创始人)的多年心得小结,并具体介绍了 C++ 17 最新标准中值得开发者关注的新特点和基本用法。

文/祁宇

本文将借助分析 magic _ get 源码来介绍 magic _ get 实现的关键科技,深入剖析实现 pod 类型反射的机理。

反射是一种根据元数据来获得类外部信息的模式,通过元数据就可以获得对象的字段和技巧等信息。C# 和 Java 的反射模式都是通过获得对象的元数据来推动的。反射可以用于依赖注入、ORM 对象-实体映射、序列化和反序列化等与对象原本信息密切相关的领域。比如 Java 的 Spring 框架,其依赖注入的基础是构建在反射的基础之上的,可以按照元数据获取类型的信息并动态建立对象。ORM 对象-实体之间的映射也是借助反射实现的。Java 和 C# 都是基于前面运行时的语言,中间运行时提供了反射模式,所以反射针对运行时语言来说很容易,但是针对没有中间运行时的语言,要想实现反射是很困难的。

在2016年的 CppCon 技术大会上,Antony Polukhin 做了一个关于 C++ 反射的发言vc6.0怎么写c语言,他强调了一个实现反射的新思路,即无需使用宏、标记和额外的软件就能推动反射。看起来似乎是一件不也许完成的任务,因为 C++ 是没有反射模式的,无法直接获得对象的元信息。但是 Antony Polukhin 发现对 pod 类型使用 Modern C++ 的模板元方法可以实现这种的编译期反射。他开源了一个 pod 类型的编译期反射库 magic _ get(),这个库也打算开启 boost。我们来看看 magic _ get 的使用示例。

#include struct foo { int some_integer; char c;};foo f {777, '!'};auto& r1 = boost::pfr::flat_get<0>(f); //通过索引来访问对象foo的第1个字段auto& r2 = boost::pfr::flat_get<1>(f); //通过索引来访问对象foo的第2个字段

通过这个例子可以发现,magic _ get 确实实现了非侵入式访问 foo 对象的数组,不需要写任何宏、额外的代码或者专门的软件,直接在编译期就可以访问 pod 对象的数组,没有运行期负担,确实有点 magic。

本文将借助分析 magic _ get 源码来介绍 magic _ get 实现的关键科技,深入剖析实现 pod 类型反射的机理。

实现 pod 类型反射的模式是这么的:先将 pod 类型转化为对应的 tuple 类型,接下来将 pod 类型的值赋给 tuple,然后就可以通过索引去访问 tuple 中的元素了。所以推动 pod 反射的关键就是如何将 pod 类型转化为对应的 tuple 类型和 pod 值数组给 tuple。

pod 类型对应的 tuple 类型是什么样的呢?以下面的 foo 为例,foo 对应的 tuple 应该是 tuple,即 tuple 中的元素种类和排序和 pod 类型中的数组完全一一对应。

根据结构体生成一个 tuple 的基本模式是,按次序将结构体中每个数组的类别萃取出来并储存起来,后面再取下来生成对应的 tuple 类型。然而字段的类别是不同的,C++ 也没有一个能直接保存不同类型的容器vc6.0怎么写c语言,因此必须一个变通的方式,用一个间接的方式来储存萃取出来的字段类别,即将类型转化为一个 size _ t 类型的 id,将这个 id 保存到一个 array 中,后面根据这个 id 来获得实际的 type 并生成对应的 tuple 类型。

这里应该解决的一个问题是怎样推动类型和 id 的互相转换。

8cd4046e2bee77850c75a5c7823058db.png

先通过一个空的模板类用来存放实际的类别,再通过 C++ 14 的 constexpr 特性,在编译期返回某个类别对应的编译期 id,就可以实现 type 转换为 id 了。具体代码如下:

https://ipad-cms.csdn.net/cms/article/code/3445

上面的代码在编译期将类别 int 和 char 做了一个编码,将类别转换为一个具体的编译期常量,后面就可以按照这种编译期常量来获得对应的详细类型。

编译期根据 id 获取 type 的代码如下:

constexpr auto id_to_type( std::integral_constant<:size_t> ) noexcept { int res{}; return res; }constexpr auto id_to_type( std::integral_constant<:size_t> ) noexcept { char res{}; return res; }

上面的代码中 id _ to _ type 返回的是 id 对应的类别的示例,如果要获得 id 对应的类别还必须借助 decltype 推导出来。magic _ get 通过一个宏将 pod 基本类别都做了一个编码,以推动 type 和 id 在编译期的互相转换。

#define REGISTER_TYPE(Type, Index) \ constexpr std::size_t type_to_id(identity) noexcept { return Index; } \ constexpr auto id_to_type( std::integral_constant<:size_t index=""> ) noexcept { Type res{}; return res; } \// Register all base types here REGISTER_TYPE(unsigned short , 1) REGISTER_TYPE(unsigned int , 2) REGISTER_TYPE(unsigned long long , 3) REGISTER_TYPE(signed char , 4) REGISTER_TYPE(short , 5) REGISTER_TYPE(int , 6) REGISTER_TYPE(long long , 7) REGISTER_TYPE(unsigned char , 8) REGISTER_TYPE(char , 9) REGISTER_TYPE(wchar_t , 10) REGISTER_TYPE(long , 11) REGISTER_TYPE(unsigned long , 12) REGISTER_TYPE(void* , 13) REGISTER_TYPE(const void* , 14) REGISTER_TYPE(char16_t , 15) REGISTER_TYPE(char32_t , 16) REGISTER_TYPE(float , 17) REGISTER_TYPE(double , 18) REGISTER_TYPE(long double , 19)

将类别编码以后,保存在那里或者怎么取下来是接着要缓解的难题。magic _ get 通过定义一个 array 来保存结构体字段类别 id。

template struct array { typedef T type; T data[N]; static constexpr std::size_t size() noexcept { return N; } };

array 中的定长数组 data 中保存数组类型对应的 id,数组下标就是字段在结构体中的位置索引。

前面介绍了怎样实现字段类别的保存和获得,那么这个字段类别是怎样从 pod 结构体中萃取出来的呢?具体的做法分为三步:

下面是详细实现代码:

1-492-png_6_0_0_135_700_622_407_892.979_1262.879-753-0-398-753.jpg

template constexpr auto fields_count_and_type_ids_with_zeros() noexcept { static_assert(std::is_trivial::value, "Not applyable"); array<:size_t sizeof> types{}; detect_fields_count_and_type_ids(types.data, std::make_index_sequence{}); return types;}template constexpr auto array_of_type_ids() noexcept { constexpr auto types = fields_count_and_type_ids_with_zeros(); constexpr std::size_t count = count_nonzeros(types); array<:size_t count=""> res{}; for (std::size_t i = 0; i < count; ++i) { res.data[i] = types.data[i]; } return res; }

定义 array 时必须定义一个固定的变量长度,长度为多少适合呢?应按结构体最多的字段数来确认。因为结构体的数组数最多为 sizeof(T),所以 array 的长度设置为 sizeof(T)。array 中的元素全部初始化为0。一般情况下,结构体字段数通常不会超过 array 的厚度,那么 array 中就经常出现多余的元素,所以还必须将 array 中多余的数组移除,只储存有效的泛型类别 id。具体的做法是计算出 array 中非零的元素有多少,接着再把非零的元素赋给一个新的 array。下面是推导 array 非零元素个数,同样是通过 constexpr 实现编译期计算。

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-129594-1.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot+VUE 前端加密算法 RSA+DES

前言 为了提高用户登陆的安全性&#xff0c;公司准备整理一份相对安全的登陆模式。 想法 主流加密算法 主流加密算法 &#xff08;一&#xff09;对称加密AES ,其特点是&#xff1a;算法简单&#xff0c;加密速度快&#xff1b; &#xff08;二&#xff09;非对称加密方式&…

spring cloud微服务_年后进大厂,必备这份微服务面试题:Dubbo+SpringBoot+Cloud

Dubbo面试题Dubbo与DubboX区别Dubbo中zookeeper做注册中心&#xff0c;如果注册中心集群都挂掉&#xff0c;发布者和订阅者之间还能通信么&#xff1f;Dubbo中有哪些角色&#xff1f;Dubbo在安全机制方面是如何解决的Dubbo执行流程&#xff1f;Dubbo支持的协议有哪些&#xff1…

全栈工程师薪水_2020 Java 全栈工程师进阶路线图,不可错过

技术更新日新月异&#xff0c;对于初入职场或者刚开始学习的同学来说&#xff0c;经常会困惑该往那个方向发展&#xff0c;这一点所有刚开始学习的人基本都有这个体会的。刚开始学习 Java 那会&#xff0c;最大的问题就是不知道该学什么&#xff0c;以及学习的顺序&#xff0c;…

cookie、Session、Token、sessionStorage、localStorage简介__Token放在 cookie, sessionStorage 和 localStorage中区别

cookie、Session、Token、sessionStorage、localStorage简介 cookie 是一个非常具体的东西&#xff0c;只得是浏览器里永久存储的一种数据&#xff0c;是浏览器实现的一种数据存储功能。Cookie在计算机中是个存储在浏览器目录中的文本文件&#xff0c;当浏览器运行时&#xf…

c语言树莓派音乐播放器,使用web端来控制我的树莓派播放音乐

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;web端控制树莓派播放音乐&#xff0c;PHPNodeJSmpg123&#xff0c;粗糙版。实现后还可以做个app什么的。代码git用到的代码内容可以在这里看~nodempg.js启动一个se…

Nginx学习_狂神

Nginx 公司产品出现瓶颈&#xff1f; 我们公司项目刚刚上线的时候&#xff0c;并发量小&#xff0c;用户使用的少&#xff0c;所以在低并发的情况下&#xff0c;一个jar包启动应用就够了&#xff0c;然后内部tomcat返回内容给用户。 但是慢慢的&#xff0c;使用我们平台的用户…

js当前时间格式化_JS时间格式化

因为new Date().toLocaleString() 在安卓和ios上的格式不一致&#xff0c;所以尽量自己写format生成一个时间数组作为一个简单的举例&#xff0c;我序列化一周的时间对象声明参数let lastMonth []let daylong 86400000判断时间值是否小于9const formatNumber num > { num…

springboot项目中使用shiro 自定义过滤器和token的方式___shiro使用token登录流程

springboot项目中使用shiro 自定义过滤器和token的方式 实现步骤主要是以下几步&#xff1a; 1. 在项目中导入maven依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.4.0</versi…

window.print 点击取消后再次打印无效_教程 | 图书馆自助复印打印机使用方法

图书馆自助复印打印机教程当当当&#xff01;教程君又来辽~今天为大家介绍的是咱们图书馆霸气十足的自助复印打印机实行全程无人化管理为读者提供自助打印、复印、扫描服务是你学习的小帮手&#xff01;实行全程无人化管理为读者提供自助打印、复印、扫描服务读者可在校园内任意…

android 支付模块封装,Android集成支付----支付宝支付总结与封装

前言类似于Android集成支付----微信支付总结与封装(可以查看本人另外一篇文章)&#xff0c;本文对支付宝支付进行一个总结与封装。相比于微信支付&#xff0c;支付宝支付没有那么多坑。集成支付宝支付SDK这里只是简要介绍&#xff0c;重点解说有坑的地方&#xff0c;具体参考官…

Springboot系列之Shiro、JWT、Redis 进行认证鉴权

Springboot系列之Shiro、JWT、Redis 进行认证鉴权 Shiro架构 Apache Shiro是一个轻量级的安全框架 Shiro可以非常容易的开发出足够好的应用&#xff0c;其不仅可以用在JavaSE环境&#xff0c;也可以用在JavaEE环境。 Shiro可以帮助我们完成&#xff1a;认证、授权、加密、会…

kettle 先删除后插入_Kettle:使用触发器和快照表进行增量数据同步

主库为Oracle 11g数据库&#xff0c;针对需要同步的表建立增量数据临时表以及反向并通过水壶定时同步到PostgreSQL数据库。1&#xff0c;主库创建快照表和快照注意&#xff1a;快照表结构和源表结构必须一致&#xff01;--创建插入快照表 CREATE TABLE SPWUSER.WEB_CUSTOMER_IN…

SpringBoot中使用Shiro和JWT做认证和鉴权

最近新做的项目中使用了shiro和jwt来做简单的权限验证&#xff0c;在和springboot集成的过程中碰到了不少坑。做完之后对shiro的体系架构了解的也差不多了&#xff0c;现在把中间需要注意的点放出来&#xff0c;给大家做个参考。 相对于spring security来说&#xff0c;shiro出…

android 手机wifi重启,路由器要不要每天重启?多亏宽带师傅透露,难怪网速一天比一天慢!...

没WiFi&#xff0c;不成活&#xff01;手机和WiFi之间&#xff0c;就像空调加棉被&#xff0c;谁也离不开谁。图片来源于网络如今WiFi已经填满了我们生活的每个角落&#xff0c;很难想象&#xff0c;如果哪天没了网&#xff0c;世界会变成什么样&#xff01;可是家里的WiFi是越…

关于Apache Commons-Lang3的使用

关于Apache Commons-Lang3的使用 在日常工作中&#xff0c;我们经常要使用到一些开源工具包&#xff0c;比如String&#xff0c;Date等等。有时候我们并不清楚有这些工具类的存在&#xff0c;造成在开发过程中重新实现导致时间浪费&#xff0c;且开发的代码质量不佳。而apache…

linux 查看ip_如何在 Linux 中查看可用的网络接口 | Linux 中国

对于某些人来说&#xff0c;他们更偏爱在安装完系统后再进行网络的配置或者更改现存的设置。众所周知&#xff0c;为了在命令行中进行网络设定的配置&#xff0c;我们首先必须知道系统中有多少个可用的网络接口。-- Sk在我们安装完一个 Linux 系统后最为常见的任务便是网络配置…

实现springboot的starter

什么是 Spring Boot Spring Boot 基本上是 Spring 框架的扩展&#xff0c;它消除了设置 Spring 应用程序所需的复杂例行配置。我们在使用 Spring 框架的时候&#xff0c;我们接触得比较多的应该是 Spring MVC、 IOC 、 DI 、AOP 等等&#xff0c;而这些框架在使用的过程中会需…

android多点触摸手势,安卓手势学习笔记(三) 多点触控

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;跟踪多个触点当多个手指同时触碰屏幕时&#xff0c;系统产生如下的事件&#xff1a;ACTION_DOWN –第一个触点。它启动了手势&#xff0c;在MotionEvent中该触点的…

SpringBoot 自动配置实现流程

&#xff08;1&#xff09;SpringBoot启动的时候加载主配置类&#xff0c;开启了自动配置功能EnableAutoConfiguration。查看SpringBootApplication &#xff08;2&#xff09;查看EnableAutoConfiguration&#xff0c;其作用是利用AutoConfigurationImportSelector给容器中导入…

spring.factories 的妙用

现象 在阅读 Spring-Boot 相关源码时&#xff0c;常常见到 spring.factories 文件&#xff0c;里面写了自动配置&#xff08;AutoConfiguration&#xff09;相关的类名&#xff0c;因此产生了一个疑问&#xff1a;“明明自动配置的类已经打上了 Configuration 的注解&#xff0…