目录
在C++中,模板是泛型编程的重要工具,用于编写通用和可重用的代码。模板主要有两种类型:函数模板和类模板。
1. 函数模板(Function Templates)
函数模板允许你定义一个函数,其操作可以应用于不同的数据类型。它们可以在编译时生成多个版本的函数,以适应不同的数据类型。
1.1 基本语法:
template <typename T>
T max(T a, T b) {
return (a > b) ? a : b;
}
这里,template <typename T>
定义了一个模板,其中 T
是一个类型参数。max
函数可以接受任意类型的参数,只要这两个参数的类型相同。
1.2 使用示例:
int main() {
cout << max(10, 20) << endl; // 使用int
cout << max(10.5, 20.5) << endl; // 使用double
return 0;
}
C++编译器根据调用 max
函数时的参数类型自动生成相应的函数版本。
2. 类模板(Class Templates)
类模板允许你定义一个类,其数据成员和成员函数可以依赖于模板参数。这使得类可以处理不同的数据类型。
2.1 基本语法:
template <typename T>
class Stack {
private:
vector<T> elements;
public:
void push(const T& element) {
elements.push_back(element);
}
T pop() {
if (elements.empty()) throw out_of_range("Stack<>::pop(): empty stack");
T elem = elements.back();
elements.pop_back();
return elem;
}
bool empty() const {
return elements.empty();
}
};
这里,template <typename T>
定义了一个类模板,T
是一个类型参数。Stack
类可以处理任意类型的数据。
2.2 使用示例:
int main() {
Stack<int> intStack;
intStack.push(1);
intStack.push(2);
cout << intStack.pop() << endl; // 输出 2
Stack<string> stringStack;
stringStack.push("hello");
stringStack.push("world");
cout << stringStack.pop() << endl; // 输出 "world"
return 0;
}
3. 模板的特性
-
模板特化(Template Specialization):
-
全特化:为特定类型提供特定实现。
template <> class Stack<bool> { // 特化版本的实现 };
-
偏特化:为模板参数的某些组合提供特定实现。
template <typename T> class Pair<T, T> { // 特化版本的实现 };
-
-
非类型模板参数:
模板参数不仅可以是类型,也可以是常量值。template <int size> class Array { int arr[size]; };
-
模板递归:
可以在模板中进行递归定义,用于编写复杂的编译时计算。
模板机制提供了极大的灵活性和重用性,是C++语言强大的特性之一。
标签:elements,函数,C++,参数,template,push,模板 From: https://www.cnblogs.com/keye/p/18344875