跟我学c++中级篇——decay
admin
2024-02-27 16:38:09
0

一、类型的萃取

在前面分析过类型的萃取,说的直白一些就是得到某些表达式或者变量的类型。这个如果在普通的编程里没啥难度,但在模板编程里或者一些特殊情况下就比较麻烦了,毕竟c++还是一门看上去高级其实仍然有些低级的语言(没有RTTI,Run-Time Type Identification)。这个结果就是c++没有办法从设计上得到运行期的类别类型。但是有困难压不领到英雄汉,在c++中还是有办法得到这些类型的,最典型的方法就是萃取。这个在前面介绍过,可以回头翻翻一下前面的公众号。
在c++中,其实有些情况下并不需要纯粹的获得这个类型的情况,比如CV限制等等可以不用考虑,那么在c++的库中,还是提供一些其它的获取类型的方式,下面介绍的std::decay就是如此,它定义在头文件中。

二、标准库中的std::decay

看一下定义:

template< class T >
struct decay;          (C++11 起)
对类型 T 应用左值到右值、数组到指针及函数到指针隐式转换,移除 cv 限定符,并定义结果类型为成员 typedef type 。正式而言:若 T 指名“ U 的数组”或“到 U 的数组的引用”类型,则成员 typedef type 为 U* 。
否则,若 T 为函数类型 F 或到它的引用,则成员 typedef type 为std::add_pointer::type 。
否则,成员 typedef type 为 std::remove_cv::type>::type 。
这些转换模仿在以值传递时,应用到所有函数参数的类型转换。
添加 decay 的特化的程序行为未定义。成员类型
名称	定义
type	应用退化类型转换到 T 的结果

其实这上面的说明就很好的解释了刚刚的情况,也就是说,这是可能会引起退化的操作,它会移除cv限定符并将数组退化为指针并消除引用(指针特性除外,如果想移除可使用std::remove_pointer)。type其实更详细的解释就是:T是引用类型,decay::type返回T引用的元素类型;当T是非引用类型,decay::type返回T的类型。

三、例程

看一下相关例程:

#include 
#include template 
struct decay_equiv : std::is_same::type, U>::type 
{};int main()
{std::cout << std::boolalpha<< decay_equiv::value << '\n'<< decay_equiv::value << '\n'<< decay_equiv::value << '\n'<< decay_equiv::value << '\n'<< decay_equiv::value << '\n'<< decay_equiv::value << '\n';
}

这个程序的运行结果全是True。再回头对比一下相关的定义,就明白了。其实配合着上面提到的std::add_pointer和std::remove_pointer就可以实现把指针也退化掉的情况,根据工作中的实际应用来处理吧。其实这个东西单纯用在普通程序里意义不是多大。更多还是用在模板编程上。看下面的例子:

    templatestatic void MyFunc(Data& d, T&& s){using U = typename std::decay::type;if (sizeof(U) <= size)new ((U*)&d) U(std::forward(s));//new定位运算,即从指定的内存位置分配else*(U**)&d = new U(std::forward(s));}

四、总结

不要小看每个小的细节的应用,这些应用一旦组合起来,可能产生一种无法想象的威力,这也是c++的魅力所在。如果在看一些开源框架中有些代码一看就头大时,不要害怕,把它拆开来分解学习,很快就明白他们的用处。如果无法全新的创新,那么组合的创新也不失为一种技术的进步。
打好基础,紧跟技术前进的脚步,这才是学好c++的前提。

相关内容

热门资讯

起点订购APP贵金属订购交易欺...   互联网上充斥着白银、铂金、铜等现货贵金属投资公司的宣传,通过不实的贵金属现货APP吸引投资者,但...
全新易购APP高额手续费的期货...   全新易购APP白银铂金现货订购出现严重的损失,投资者在这个平台根本赚不到钱,开始还好,后面的交易...
银行板块震荡上扬 中国银行等股... 观点网讯:7月8日,银行板块震荡上扬,中国银行、农业银行、建设银行、成都银行、工商银行等股纷纷上扬。...
AI Agent进入深水区:企... AI Agent从技术概念走向商业落地,企业付费意愿成为检验产品价值的唯一标准。过去两年大量AI创业...
一通智投APP内幕交易欺骗投资...   一通智投APP虚假现货订购交易为非法期货,投资者被宣传广告给诱导,下载了一通智投APP,结果在这...
港股科技股全线大涨!跌多了是基... 港股市场近日整体有明显反弹的科技股今日再度集体走强,恒生科技指数拉升涨超3%。个股中,联想涨超8%,...
一场博览会,看透低空经济风口全... 文丨许佳慧 低空经济风起,谁是真正的弄潮儿? 【观赛道:题材风口开启,全链布局成型】 低空经济有多火...
黄金单边牛市没那么快回来?预测... 黄金这波反弹刚冒头,没人敢直接砸重仓赌方向。Polymarket上的交易显示,黄金7月触及4300美...
超颖电子布局“A+H”:一季度... 瑞财经 吴文婷7月6日,超颖电子发布公告称,为满足公司业务发展需要,深入推进国际化战略,打造国际化资...
偏袒?阿根廷球员扇耳光+飞铲无... 北京时间7月8日,2026年世界杯1/8决赛,阿根廷3-2逆转埃及晋级八强。不过,本场比赛的判罚在赛...
原创 高... 在国际关系的复杂棋局中,盟友与对手从来都不是一成不变的。最近,俄罗斯通过中间渠道从日本进口航空燃油的...
优质药食同源食材选购指南:甘草... 在现代保健理念中,药食同源的概念越来越受到重视。许多人开始关注如何选购优质的药食同源食材,以便更好地...
AI产业进展提振信心,科创创业... 截至7月8日11点15分,上证指数涨0.28%,深证成指跌0.28%,创业板指涨0.51%。油气开采...
将多色3D打印提速5倍,消费级... 消费级3D打印企业快造科技(Snapmaker)近日完成10亿元C轮融资。本轮由凯辉基金领投,好未来...
“物理AI第一股”来了!Mom... 2026年7月8日,全球领先的物理AI公司Momenta正式在港交所挂牌上市,股票代码为6880.H...
投资需求增长的核心动力是什么? 在金融市场中,投资需求的增长受到多种因素的综合推动,这些因素构成了投资需求增长的核心动力。 首先,经...
苏州得鹿食品有限公司成立 注册... 天眼查App显示,近日,苏州得鹿食品有限公司成立,法定代表人为周锋,注册资本50万人民币,经营范围为...
刚刚,又一家厦门企业在港股上市... 最新消息! 厦门又迎来一家上市公司! 7月8日 厦门瑞为信息技术股份有限公司 (以下简称“瑞为技术”...
韩国综合指数转涨,盘初一度跌近... 8日,韩国综合指数转涨,一度涨超1.6%,现涨0.7%,盘初一度跌近4%。个股方面,SK海力士涨近4...
原创 7... 四千多欧洲人因为高温没了命,大半是装不起买不起空调的独居老人。现在老百姓抢着买能解决问题的中国空调,...