第十四章、模板

模板(Template)是C++中实现泛型编程的工具。简单的说模板就是使用一套代码编写出与类型无关的函数模板或者类模板。在使用时在根据操作数据的类型用这个函数模板或类模板来生成相应的函数或者类。 模板可以实现代码和类型的脱离,在使用时根据类型来生成和类型相关的代码,实现代码的通用(简称:泛型编程)。

1. 模板原理和 typename

举个例子,如果需要计算两个整数相加返回两个整数和,则我们编写函数如下:

int myadd(int x, int y) {
    return x + y;
}

如果要实现两个双精度浮点类型的两个数字相加则需要编写函数如下:

double myadd(double x, double y) {
    return x + y;
}

如果要实现 Complex 类型的两个对象相加则需要编写函数如下:

Complex myadd(Complex x, Complex y) {
    return x + y;
}

实际上我们可以把类型提取出来,我们取名称为 T,这样我们的代码就可以写成如下:

T myadd(T x, T y) {
    return x + y;
}

然后我们在告诉编译器, T 是类型参数名,在需要的时候将 T 替换成相关的类型,然后再用替换后的类型生成相应的函数。这样我们就随时可以根据不同的类型来生成不同的函数了。

typename 关键字

typename 关键字 的主要作用是声明一个类型参数,当编译器编译到某个标识符时当做一个类型,稍后在进行替换成相应的类型。

如改写上面的代码如下:

template <typename T>
T myadd(T x, T y) {
    return x + y;
}

这样 myadd 将不再是一个函数,而是一个函数模版,typename T 是告诉编译器, T 是类型参数。在需要时要进行替换。

这样函数模版将 T 替换成 float 则生成的函数就是参数和返回值都是 float 类型的函数了。