Bootstrap

C++学习——模板与泛型编程

定义模板

函数模板

可以定义一个通用的函数模板,而不是为每个类型都定义一个新函数。

一个函数模板就是一个公式,可用来生成针对特定类型的函数版本。

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 
;