简介:本文将详细介绍 C++ 中的模板,特别是 template<class T> 的用法。我们将从基础概念开始,逐步深入到高级应用,帮助读者全面理解模板的原理和用法。
C++ 中的模板是一种编程技术,它允许我们编写与数据类型无关的代码。通过使用模板,我们可以编写一个函数或类,该函数或类可以处理不同的数据类型,而无需为每种数据类型单独编写代码。这在泛型编程中非常有用,可以大大提高代码的重用性和可维护性。
在 C++ 中,模板有两种类型:函数模板和类模板。函数模板用于定义与函数相关的通用算法,而类模板则用于定义与类相关的通用数据结构。
一、函数模板
函数模板定义了一个可以处理多种数据类型的通用函数。在定义函数模板时,我们使用 template 关键字后跟尖括号 <> 和类型参数列表。例如:
template <class T>T add(T a, T b) {return a + b;}
在上面的例子中,我们定义了一个名为 add 的函数模板,它接受两个类型为 T 的参数,并返回它们的和。这里的 T 是一个类型参数,可以是任何数据类型,如 int、float、char 等。
使用函数模板时,编译器会根据实际参数的类型自动推断类型参数的值。例如:
int main() {int a = 5, b = 10;float c = 5.5, d = 10.5;int sum = add(a, b); // T 被推断为 intfloat sum2 = add(c, d); // T 被推断为 floatreturn 0;}
二、类模板
类模板定义了一个可以处理多种数据类型的通用类。类模板的定义方式与函数模板类似,也是在类定义中使用 template 关键字和类型参数列表。例如:
template <class T>class Array {public:Array(T* data, int size);T& operator[](int index);private:T* data;int size;};
在上面的例子中,我们定义了一个名为 Array 的类模板,它使用一个类型参数 T 表示数组中元素的数据类型。该类包含一个构造函数和一个索引运算符重载函数,以及一个指向数据的指针和数组大小。
使用类模板时,我们需要先实例化一个具体的类对象。例如:
int main() {int data[5] = {1, 2, 3, 4, 5};Array<int> arr(data, 5); // 实例化 Array<int> 类对象arr[0] = 10; // 使用索引运算符访问数组元素并赋值return 0;}
三、模板进阶用法
除了基本的函数和类模板外,C++ 还支持更高级的模板用法,如模板特化和偏特化等。这些用法可以进一步扩展模板的功能和灵活性。例如: