C++模板是一种通用的代码蓝图,允许根据不同类型的参数生成特定的函数或类。模板可以在编译时进行类型安全检查,并在运行时生成对应的代码,提高代码的复用性和性能。
在C++中,我们可以使用template
关键字来定义模板。模板可以包含类型参数和非类型参数,用于接收不同的参数类型和值。下面是一个使用模板的基本语法:
template <typename T>
// 或者
template <class T>
// 使用模板定义函数
void print(T value) {
// 函数体
}
// 使用模板定义类
template <typename T>
class MyTemplateClass {
// 类定义
};
类型模板参数允许我们以泛型的方式接受不同类型的参数。例如,我们可以定义一个模板函数来比较两个数的大小:
template <typename T>
T max(T a, T b) {
return (a > b) ? a : b;
}
在上面的代码中,typename T
表示我们将接受一个类型为T
的参数。模板函数max
可以接受不同类型的参数(如int、float、double
等),并返回较大的值。
下面是一个使用模板函数的示例,计算数组的平均值:
template <typename T, int size>
T average(T arr[]) {
T sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i];
}
return sum / size;
}
int main() {
int intArr[] = {1, 2, 3, 4, 5};
double doubleArr[] = {1.5, 2.5, 3.5, 4.5, 5.5};
int intAvg = average<int, 5>(intArr);
double doubleAvg = average<double, 5>(doubleArr);
// 输出结果
cout << "Int average: " << intAvg << endl;
cout << "Double average: " << doubleAvg << endl;
return 0;
}
在上面的代码中,我们定义了一个模板函数average
,它接受一个类型为T
的数组和一个非类型参数size
,用于指定数组的大小。在main函数中,我们分别传递了一个int类型的数组和一个double
类型的数组,并调用了average
函数来计算它们的平均值。
当涉及到类模板时,我们可以将模板应用于整个类定义,以便在不同类型的参数下生成具体的类。以下是一个示例,演示了如何使用类模板创建一个通用的栈(stack
)类:
template <typename T>
class Stack {
private:
T* data; // 存储数据的数组
int size; // 栈的大小
int top; // 栈顶位置
public:
Stack(int s) : size(s), top(-1) {
data = new T[size]; // 动态分配内存
}
~Stack() {
delete[] data; // 释放内存
}
void push(T value) {
if (top == size - 1) {
cout << "Stack is full." << endl;
} else {
data[++top] = value;
}
}
T pop() {
if (top == -1) {
cout << "Stack is empty." << endl;
return T(); // 返回默认值
} else {
return data[top--];
}
}
};
在上述示例中,我们定义了一个名为Stack
的类模板,它接受一个类型参数T。类模板有一个私有数据成员data
,用于存储栈中的元素;还有三个私有成员变量size、top
,分别表示栈的大小和栈顶的位置。公共成员函数push
和pop
用于向栈中添加元素和移除元素。
通过使用类模板,我们可以在不同的类型参数下创建具体的栈对象。以下是一个示例,展示了如何使用Stack类模板创建整数栈和浮点数栈:
int main() {
Stack<int> intStack(5); // 创建一个整数栈,大小为5
Stack<float> floatStack(3); // 创建一个浮点数栈,大小为3
intStack.push(1);
intStack.push(2);
intStack.push(3);
floatStack.push(1.5);
floatStack.push(2.5);
cout << "Popped value from intStack: " << intStack.pop() << endl;
cout << "Popped value from floatStack: " << floatStack.pop() << endl;
return 0;
}
在上述示例中,我们创建了一个int类型的栈和一个float类型的栈。然后,我们分别向两个栈中压入一些元素,并从栈顶弹出一个元素。通过类模板,我们可以方便地创建不同类型的栈,并在编译时进行类型安全检查。
C++模板是一种强大的编程工具,可以实现泛型编程,提高代码的灵活性和复用性。通过使用模板,我们可以根据不同类型的参数生成特定的函数或类。本文介绍了C++模板的基本语法、类型模板参数和模板函数的示例,并展示了模板在实际开发中的应用。合理利用C++模板可以简化代码编写并提高程序的性能和可维护性。