跟我学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++的前提。

相关内容

热门资讯

黄金暴跌,市场总有轮回。 今天不聊别的,还是聊黄金。但今天为了说清楚黄金,我会先分析同样经历了暴跌的比特币、以太坊等crypt...
2025年净利最高预亏2.9亿... 北京商报讯(记者 丁宁)2月2日,双鹭药业(002038)盘中触及跌停,截至北京商报记者发稿,双鹭药...
盘点2025信托业(二)|新监... 中国网财经2月2日讯 2025年,信托行业监管制度体系经历根本性重塑,“1+N”政策框架落地生根,为...
中国国航2026年春运计划执行... 中国国际航空股份有限公司(下称“国航”)2月2日宣布,2026年春运将全面升级运力投入,在册飞机数量...
原创 今... 一家公司,在不到一个月的时间里,股价像坐上了火箭,一口气连拉17个涨停板,价格翻了4倍多。 就在所有...
脑出血后昏迷不醒有什么治疗方法... 脑出血是一种发病急、进展快、致死致残率极高的急性脑血管疾病,其发病率约占全部脑卒中的20%~30%,...
原创 今... 今天A股跌得让人心慌,商业航天、黄金、农业,热点一个接一个熄火。 但在一片惨绿中,有一个板块却像打了...
2026年存款搬家,有望为A股... 根据财通证券测算,2026年企业与居民中长期存款的到期规模在57.3万亿元,而居民中长期存款到期规模...
两部门发文明确增值税进项税额抵... 财政部 税务总局 关于增值税进项税额抵扣等有关事项的公告 财政部 税务总局公告2026年第13号 根...
兴业银行多位经理被禁止从事银行... 据国家金融监督管理总局大连监管局2月2日公开的行政处罚信息显示,兴业银行股份有限公司大连分行因信贷业...
原创 金... 深圳水贝市场里,一位女士快速计算着价格,掏出银行卡支付了近12万元,买下100克金条。 黄金价格正在...
韩国股市大跌触发熔断机制 1日,韩国首尔,中区一家银行交易室的电子屏显示韩国综合股价指数(KOSPI)。视觉中国/图 韩国股市...
尿色加深、皮肤泛黄时,你的肝可... 生活中,不少人发现尿色变深、皮肤泛黄时,会误以为是喝水少、上火或肤色问题,简单调整后便不再关注。可这...
30亿元红包!千问宣布 2月2日,千问APP宣布投入30亿元启动“春节请客计划”,以免单形式请全国人民在春节期间吃喝玩乐,感...
周生生足金挂坠被检测出含铁银钯... 编者按:维护消费者权益,守护消费安全。央广网啄木鸟消费者投诉平台,保障消费者合法权益,为新消费时代保...
中国AI应用春节红包大战 阿里... 中国科技巨头为推广旗下人工智能(AI)产品重演11年前的红包大战,继腾讯和百度后,同样在追赶字节跳动...
最新!多家银行,紧急调整! 近期,国际黄金与白银价格在创下历史新高后剧烈波动。2月2日,金银价格显著回调,黄金期货一度跌破每盎司...
米兰冬奥中国代表团成立丨冰雪热... 聚焦健康中国 冬奥会 (第一健康报道北京 实习记者袁正杰) 米兰冬奥会中国体育代表团正式成立,标志着...
i茅台:月活用户超1531万,... 1499元飞天上架已满月,i茅台披露关键数据。 2月2日,据“小茅i茅台”微信公号,i茅台表示,“这...
多重风险高悬 一批*ST公司拉... 伴随2025年度业绩预告密集发布,一批上市公司拉响退市风险“警报”。 据上海证券报初步统计,近期,已...