定义模板
函数模板
可以定义一个通用的函数模板,而不是为每个类型都定义一个新函数。
一个函数模板就是一个公式,可用来生成针对特定类型的函数版本。
compare 的模板版本可能像下面这样:
template <typename T>
int compare(const T &v1, const T &v2)
{
if (v1 < v2) return -1;
if (v2 < v1) return 1;
return 0;
}
模板定义以关键字 template 开始,后跟一个模板参数列表,这是一个逗号分隔的一个或多个模板参数的列表,用小于号(<)和大于号(>)包围起来。
当使用模板时,我们(隐式地或显式地)指定模板实参,将其绑定到模板参数上。
compare 函数声明了一个名为 T 的类型参数。在 compare 中,我们用名字 T 表示一个类型。而 T 表示的实际类型则在编译时根据 compare 的使用情况来确定。
实例化函数模板
当调用一个函数模板时,编译器(通常)用函数实参来为我们推断模板实参。
编译器用推断出的模板参数来为我们实例化一个特定版本的函数。
当编译器实例化一个模板时,它使用实际的模板实参代替对应的模板参数来创建出模板的一个新“实例”。
模板类型参数
可以将类型参数看作类型说明符,就像内置类型或类类型说明符一样使用。特别是,类型参数可以用来指定返回类型或函数的参数类型,以及在函数体内用于变量声明或类型换行:
// 正确:返回类型和参数类型相同
template <typename T> T