0. 什么是类型别名
随着程序越来越复杂,程序中用到的类型也越来越多,这种复杂性体现在两个方面。
一是一些类型难于“拼写”,它们的名字既难记又容易写错,还无法明确体现其真实目的和含义。
二是有时候根本搞不清到底需要的类型是什么,程序员不得不回过头去从程序的上下文寻求帮助。
解决问题一,可以使用类型别名(type alias) 技术,即给某一个类型起一个别名,让复杂的名字变简单,易于理解和使用,帮助程序员清楚地知道使用该类型的目的。
实际就是你的大名叫起来有些拗口,领导通常喜欢叫你“小张”、“老王”。
解决问题二,可以使用auto和decltype。
1. 如何定义类型别名
例如,数组的索引一定是不小于0的,因此使用unsigned long
基本满足数组索引的需求,此时我们若能把unsigned long
叫做idx
(index的缩写),我们一看就知道这个类型的值可以用来放在数组的中括号[]
中,在不越界的情况下访问数组元素。
可以使用typedef
关键字,实现上面的需求:
typedef unsigned long idx;
也可以使用别名声明(alias declaration) 技术,这是C++11新标准规定的方法:
using idx = unsigned long;
类型别名和类型本来的名字是完全等价的,每个别名一定可以写成一种更基础的形式。
2. 复合类型的类型别名
声明基本内置类型、自定义数据类型的类型别名比较简单:
typedef double wages; // 用一个double存储工资wages
using wages = double; // 同上
class MassachusettsInstituteOfTechnology;
typedef MassachusettsInstituteOfTechnology MIT;
using MIT = MassachusettsInstituteOfTechnology;
复合类型的声明,以及使用别名的复合类型,就容易出错了。
2.1 数组
我们可以为数组定义了一个别名:
// 可以表示二维网格的位置
typedef unsigned int ipos[2];
using ipos = unsigned int[2];
能看到typedef
的定义方式,理解起来有些不同,但是using声明使用=
赋值运算符,看起来直观一些。
理解typedef
,我们首先考虑去掉typedef
:
unsigned