模板
1. 定义
在 C++ 中,模板(Template)是一种参数化的类型,它允许在不知道具体类型的情况下定义类或函数。模板可以用于创建泛型类(可以用于多种数据类型的类)或者泛型函数。这使得代码更加灵活和可重用。
2. 函数模板
函数模板允许在编写一个函数时使用一个或多个类型参数,这些类型参数在调用函数时由实际使用的类型来确定。
例如,下面是一个简单的函数模板示例:
C
template <typename T>
T max(T a, T b) {
return a > b ? a : b;
}这里 max 函数可以接受任何类型的 a 和 b,只要它们支持比较操作符。
3. 类模板
类模板允许你定义一个类,这个类的某些部分是依赖于类型参数的。当使用类模板创建对象时,必须指定类型参数,这样编译器就能生成具体的类。
C
template <typename T>
class Stack {
private:
std::vector<T> elements;
public:
void push(T const& item) {
elements.push_back(item);
}
T pop() {
T result = elements.back();
elements.pop_back();
return result;
}
bool empty() const {
return elements.empty();
}
};
// Stack 可以用来创建任何类型的栈,比如整数栈 Stack<int> 或者字符串栈 Stack<std::string>。4. 模板特化
有时候可能需要为特定的数据类型提供不同的实现,这时你可以使用模板特化(Specialization)。模板特化允许为特定类型提供不同的定义。
例如,对于 std::string 类型,你可能会想要提供一个不同的 max 函数实现:
C
template <>
std::string max<std::string>(std::string a, std::string b) {
return a.length() > b.length() ? a : b;
}5. 非类型模板参数
除了类型参数之外,C++ 还支持非类型模板参数,即可以在模板声明中传递常量表达式。
C
template <int N>
class ConstantClass {
public:
static int getConstantValue() { return N; }
};在这个例子中,N 是一个非类型模板参数,可以用来传递常量值。 使用模板时要确保你的编译器支持你所需要的 C++ 标准版本,因为模板的一些特性是在 C++ 不同版本中逐步引入的。
