C++中的模板是一种在编译时进行类型转换、生成代码的元程序方式。通过使用模板,可以在一定程度上解决代码重复问题,比如实现多个相似函数或类的情况。模板分为函数模板和类模板两种。
函数模板
函数模板是一种用于生成函数定义的模式或蓝图,它能够以通用的方式编写代码,从而消除了很多重复的代码。函数模板采用模板参数来代表类型或值,这些模板参数会在编译时被实例化成具体的类型或值。定义函数模板使用template关键字,例如:
template <typename T>
T max(T x, T y) {
return (x > y ? x : y);
}
上面的max函数是一个简单的函数模板,它接收两个类型相同的参数,并返回它们中的较大值。函数模板的类型参数通常用typename表示。
可以在调用函数时指定具体的类型参数,例如:
int max_int = max<int>(3, 5);
double max_double = max<double>(3.14, 1.414);
在上面的示例中,max函数被实例化成了两个不同类型的函数,一个返回int类型的结果,一个返回double类型的结果。
类模板
类模板是用于生成类定义的模式或蓝图,它使得我们可以以通用的方式编写类,从而抽象出类的共性部分,实现代码的重复使用。类模板定义使用template关键字,例如:
template <typename T>
class Stack {
private:
T* data;
int top;
int size;
public:
Stack(int s) {
data = new T[s];
top = -1;
size = s;
}
void push(T x) {
if (top < size - 1) {
data[++top] = x;
}
}
T pop() {
if (top >= 0) {
return data[top--];
}
}
};
上面的Stack类是一个简单的类模板,它代表一个栈。类模板中的T就是一个通用的类型参数,用于代表栈中的元素类型。使用时可以通过指定类型参数来实例化Stack类,例如:
Stack<int> int_stack(10);
int_stack.push(5);
int_stack.push(10);
int num = int_stack.pop();
Stack<double> double_stack(10);
double_stack.push(3.14);
double_stack.push(1.414);
double num = double_stack.pop();
在上面的示例中,我们分别实例化了一个int类型的栈和一个double类型的栈,它们使用的是同一个类模板Stack,但是类型参数不同。