C++中怎么定义type_traits


这篇文章主要介绍“C++中怎么定义type_traits”,在日常操作中,相信很多人在C++中怎么定义type_traits问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++中怎么定义type_traits”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!模板编程不像常规的代码,可以有if-else这些流控制语句,我们需要充分利用模板、模板特例、类型转换等特性来实现编译期的一系列判断和类型转换。第一步,我们需要定义true和false两个常量,所有的type_traits都基于此。我们的目的就是要用一个模板类型来表示是非,其中的value正好是这两个值。之后我们更高级的判断类型都是继承自这两个类型的其中一个,通过这种方式获取value值就可以获取true和false了。如果听这个解释有点晕的话,不要紧,我们直接来看代码。这里需要注意的是,既然type_traits都是编译期行为,因此其成员只能是静态不可变成员(编译期就可以确定的成员)。有了基础常量,我们可以先做一些简单的类型判断,比如说判断这个类型是不是void。这里的思路是,针对于所有类型的模板,继承自false_type,而针对于void类型,我们给予一个模板特例,让他继承自true_type。这样一来,只有当类型是void的时候才会推导true,其他的就会推导false。请看例程:这里我们可以做一些简单的测试,来判断函数的返回值是否为void:有了判断void的思路基础,不难写出判断其他类型的,比如说判断是否为浮点数,那么只需要对float,double,long double进行特殊处理即可,请看代码:整型判断相对复杂一点,需要对char,signed char,unsigned char,short,unsigned short,int,unsigned,long,unsigned long,long long,unsigned long long都进行特例编写,方法相同,不再赘述。在上一节编写is_floating_point的时候可能会发现这样的问题:但是照理来说,const类型以及引用类型不应该影响他浮点数的本质,当然,我们也可以针对所有的const以及引用情况都编写模板特例,但这样太麻烦了,如果有办法可以去掉const以及引用这些符号,然后再去判断的话,就会减少我们很多工作量。与此同时,这样的类型处理在实际编程时也是很有用的。那么,如何去掉const?请看代码:同样的思路,当T是const类型时,我们变换成const T,然后只取出T,其他类型时直接透传T。同理,用这种方法也可以去除引用:因此,is_floating_point就可以改写成这样:我们搞这样一系列的类型封装,最主要的原因是为了在编译器进行逻辑判断。因此,必然要进行一个选择逻辑,也就是当条件成立时,选择某一个类型,不成立时选择另一个类型。这个功能非常好实现,请看代码:当第一个参数为true时,type就与T1相同,否则就与T2相同。我们有时候还需要判断两个类型是否相同,这部分也很好实现,请看代码:其实按照这些逻辑,我们几乎可以写出type_traits中的所有功能了。STL中还实现了合取、析取、取反等操作,只是将逻辑判断转为了模板形式,这些用起来更方便,但不是必须的。大家感兴趣可以阅读这部分源码。is_base_of用于判断两个类型是否是继承关系,在C++中已经存在了对应的关键字用于判断:__is_base_of关键字就可以完成这样的工作,所以我们封装它为模板即可:但除了这种直接使用编译器提供的关键字外,这个功能还有一种其他的实现方法。如何判断一个类是否为一个类的父类呢?其实就看指针能否转换(多态)即可。请看代码:如果D是B的子类,那么就会调用第一个函数,从而推断出返回值是true_type,否则调用第二个函数,推断出返回值是false_type。不过这样做还必须加一个判断,就是B和D必须都是类才行,而且需要去掉const等因素。到此,关于“C++中怎么定义type_traits”的学习就结束了,希望能够解决大家免费云主机域名的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!

相关推荐: 表单传送数据到php乱码如何解决

这篇文章主要介绍了表单传送数据到php乱码如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇表单传送数据到php乱码如何解决文章都会有所收获,下面我们一起来看看吧。 表单传送数据到php乱码的解决办法:1、在html中的hea…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/29 11:02
下一篇 03/29 11:03

相关推荐