在C++中,模板是一种强大的工具,用于实现代码复用和泛型编程。模板允许程序员编写通用的代码,这些代码可以在不同的数据类型上工作,而无需为每种数据类型重复编写代码。模板分为函数模板和类模板,它们为C++程序提供了更高的灵活性和效率。
函数模板
函数模板允许程序员定义一个通用的函数,该函数可以在不同的数据类型上工作。函数模板的定义以关键字template
开始,后跟模板参数列表。例如:
cpp复制
template <typename T>
T add(T a, T b) {
return a + b;
}
在这个例子中,add
是一个函数模板,它可以在任何支持+
运算符的数据类型上工作。使用时,编译器会根据传入的参数类型自动推导模板参数T
的类型。例如:
cpp复制
int result1 = add(5, 3); // T推导为int
double result2 = add(2.5, 1.5); // T推导为double
类模板
类模板允许程序员定义一个通用的类,该类可以在不同的数据类型上工作。类模板的定义也以关键字template
开始,后跟模板参数列表。例如:
cpp复制
template <typename T>
class Stack {
private:
vector<T> elements;
public:
void push(T elem) {
elements.push_back(elem);
}
T pop() {
T elem = elements.back();
elements.pop_back();
return elem;
}
bool isEmpty() const {
return elements.empty();
}
};
在这个例子中,Stack
是一个类模板,它可以在任何数据类型上工作。使用时,可以这样声明一个Stack
对象:
cpp复制
Stack<int> intStack;
intStack.push(1);
intStack.push(2);
intStack.push(3);
while (!intStack.isEmpty()) {
cout << intStack.pop() << endl;
}
模板特化
模板特化允许程序员为特定的模板参数提供特殊的实现。这在某些情况下非常有用,例如当通用模板在某些数据类型上无法正常工作时。例如:
cpp复制
template <typename T>
class Box {
public:
T value;
Box(T val) : value(val) {}
};
// 特化Box类模板,用于类型char
template <>
class Box<char> {
public:
char value;
Box(char val) : value(val) {}
};
在这个例子中,Box
类模板有一个特化版本,专门用于char
类型。
标准模板库(STL)
C++标准模板库(STL)是C++模板的一个重要应用。STL提供了一组通用的容器(如vector
、list
、map
等)、算法(如排序、查找等)和迭代器,这些工具大大简化了C++编程。例如:
cpp复制
vector<int> numbers = {3, 1, 4, 1, 5, 9, 2, 6};
sort(numbers.begin(), numbers.end());
for (int num : numbers) {
cout << num << " ";
}
// 输出:1 1 2 3 4 5 6 9
总结
模板是C++中实现代码复用和泛型编程的强大工具。通过函数模板和类模板,可以编写通用的代码,这些代码可以在不同的数据类型上工作,而无需重复编写代码。模板特化则允许为特定的数据类型提供特殊的实现。STL是模板的一个重要应用,它提供了丰富的容器、算法和迭代器,大大简化了C++编程。掌握模板后,你将能够编写更加高效、灵活的C++程序。