购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.2 创建类型别名和模板别名

在C++中,我们可以创建用于代替类型名称的同义词,这可以通过typedef关键字进行声明。这在多数情况下都很有用,例如为类型或函数指针创建更简短或更有意义的名称。但是,typedef声明不能与模板一起使用去创建模板类型别名。例如,std::vector<T>不是类型(std::vector<int>是类型),但当占位符T被替换为实际类型时,具体的类型就被创建了。

在C++11中,类型别名是已经声明的类型的另一种名称,模板别名是已声明的模板的另一种名称。我们可以使用新引入的using关键字来声明这两种类型的别名。

1.2.1 使用方式

❍ 用using identifier=type-id这样的形式创建类型别名,示例如下:

❍ 用template<template-params-list>identifier=type-id这样的形式创建模板别名,示例如下:

为了保证一致性和可读性,我们应该这么做:

❍ 创建别名时,不要混用typedef和using声明。

❍ 创建函数指针类型名称时,首选using语法。

1.2.2 工作原理

typedef声明为类型引入了同义词(即别名)。它不引入其他类型(如class、struct、union和enum声明)。使用typedef声明引入的类型名称遵循与标识符名称相同的隐藏规则。它们也可以被重新声明,但是必须指向相同的类型(因此,只要同义词指向的是相同的类型,就可以在同一单元针对同一类型有多次合法的typedef声明)。下面是关于typedef声明的几个示例:

类型别名声明和typedef声明之间没有区别,它可出现于块作用域、类作用域或命名空间作用域。请参考C++11的7.1.3.2节:

typedef名称也可以通过别名声明引入。using关键字后面的标识符变成typedef名称,标识符后面的可选属性说明符序列属于该typedef名称。它的语义与由typedef说明符引入的语义相同。特别是,它没有定义新的类型,也不应出现在type-id中。

但是,相对于实际类型,当数组和函数指针使用别名声明时,更具可读性,也更清晰。在1.2.1节的示例中,很容易理解array_t是10个整数数组的类型的名称,而fn是接受两个类型分别为byte和double的参数、返回值为void的函数类型的名称。这也与声明std::function对象的语法(例如,std::function<void(byte,double)>f)一致。

请务必注意以下事项:

❍ 不能偏特化或显式特化模板别名。

❍ 在推导模板形参时,通过模板实参推导始终无法推导出模板别名。

❍ 特化别名模板时所生成的类型不允许直接或间接使用它自己的类型。

新语法的目的是定义模板别名。模板别名是一种模板,当其特化时等价于将模板别名的模板实参替换为类型标识中的模板形参的结果。

1.2.3 延伸阅读

❍ 阅读1.14节,以了解如何在不显式指定模板参数的情况下使用类模板。 80HS9ce1UYFYgfJO2JUWuqucdlsGaVVnpdK0KYB3ORI0lXfJdpt9VZ9C+QtNPfx4

点击中间区域
呼出菜单
上一章
目录
下一章
×