| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 浅析decltype一些有趣(实用)的用法 -> 正文阅读 |
|
[C++知识库]浅析decltype一些有趣(实用)的用法 |
目录 一、透过表象,直探本质1.decltype关键字该如何理解???????decltype用于推导类型是大家都知道,可真正面对decltype的各种写法时,又容易迷失在类型判断的困境中。以上面的两行代码为例,来说明问题:
????????相信大家也发现了,上面两句这样写非常类似于变量的定义和初始化。那么,不论decltype后的“()”中写的多么复杂,最后decltype()返回的结果必定只是一个类型而已。理解了这条本质,下面的问题讨论起来就轻松一些啦。 2.auto VS decltype????????说起类型推断,马上就会有读者说:auto不也可以进行类型推断吗? auto确实可以进行类型推断,且与decltype都是在编译期进行类型推断的,但它们两者也有着以下的区别:
二、decltype的使用分析1.“()”中放入的是变量? ? ? ? 这种情形下的类型推断比较好理解,故简单举例说明存在const、引用时的情况,且使用起来感觉与auto的类型推断差不多。
2.“()”中放入的是表达式
????????某些读者可能会对最后一条语句的推断结果感到意外,笔者在此想做一番细致分析:首先,*pI得到的是指针所指向的对象,且*pI能作为左值使用(赋值);其次,才涉及到decltype的一条规则,即若()中的表达式能作为左值使用,那么decltype返回的就是一个引用类型。 ? ? ? ? 同时还有一种写法也有类似的效果,decltype((变量))的结果也是一个引用,具体而言给变量套上一层括号后,就成为了表达式,而该表达式能作为左值使用。 3.“()”中放入的是函数? ? ? ? 与前两种情况相比,该情形下的用法会显得不那么容易理解。还是以实例来进行说明,帮助各位读者理解decltype与函数碰撞时所隐藏的秘密。 【测试代码】
【程序结果】 ?【结果分析】 ????decltype(add)?*T?=?add;? “()”中放入的是函数名,decltype推断后的结果为函数类型int(int),其后紧跟着*修饰,则得到了一个函数指针类型的变量T,其指向函数实体add。? ????decltype(&add)?t?=?add;? “()”中放入的是函数地址,decltype推断后的结果直接就是函数指针类型int(*)(int),此时得到了一个函数指针t,其指向函数实体add。 ????decltype(add)?&t2?=?add; 与加指针标识符*的情况类似,最后获得的是函数引用类型。 ????decltype(add2)?t1?=?add2;? “()”中放入的是函数名,返回的是函数类型int(int, int),此时获得是一个具有函数类型int(int, int)的对象t1。 等等...,具有函数类型的对象?啥意思? 换句话说,此时获得的t1为一种可调用对象(函数对象或仿函数),所以在上面的演示中才利用lambda表达式生成了add2对象,以作为t1的值。 三、decltype的方便之处(实战演示)? ? ? ? 看到这儿,可能依然有读者觉得还不过瘾,甚至还可能觉得前面演示的decltype看起来也没多大威力嘛,况且还有“坑”,用不好就完蛋。 ????????C++新标准里的东西,让人惊叹的同时,又让人感觉到费解。虽然笔者有着经典C++的基础,但在学习C++11之后的内容时,也是同大多初学者一样喜忧参半。作为新标准内容之一的decltype,最大的妙用还是在泛型编程中来使用,其强大的类型推断功能可以很好地与模板参数的推导结合起来。 ????????下面是一份在二叉查找树中插入结点的实际例子,演示了decltype在泛型编程中的妙用:
【程序结果】参阅资料> C++ primer 第5版 > 狄泰软件学院C++深度解析教程 > C++ 新经典—王健伟 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 6:39:07- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |