C++ 模板是一种用于创建通用代码的机制,可以在编译时将特定的数据类型参数传递给代码,从而生成具体的代码。使用模板,可以编写通用的算法和数据结构,以便在多个项目和数据类型上重用它们。
C++ 模板有两种类型:函数模板和类模板。
函数模板允许在函数定义中使用一个或多个类型参数,从而创建通用函数。例如,下面是一个简单的函数模板,用于计算两个值的最大值:
template <typename T>
T max(T a, T b) {
return a > b ? a : b;
}
这个函数模板中的 typename T
表示一个类型参数,它在函数体中用作类型 T
的占位符。可以使用任何可比较的类型调用这个函数模板,例如:
int a = 5, b = 3;
std::cout << max(a, b) << std::endl; // 输出 5
double x = 3.14, y = 2.71;
std::cout << max(x, y) << std::endl; // 输出 3.14
类模板是用于创建通用类的机制。类模板定义中的一个或多个类型参数允许在编译时指定具体的数据类型。例如,下面是一个简单的类模板,用于实现一个通用的栈数据结构:
template <typename T>
class Stack {
public:
void push(T value) { m_data.push_back(value); }
T pop() {
T value = m_data.back();
m_data.pop_back();
return value;
}
private:
std::vector<T> m_data;
};
这个类模板中的 typename T
表示一个类型参数,它在类定义中用作类型 T
的占位符。可以使用任何数据类型实例化这个类模板,例如:
Stack<int> intStack;
intStack.push(1);
intStack.push(2);
intStack.push(3);
std::cout << intStack.pop() << std::endl; // 输出 3
Stack<std::string> stringStack;
stringStack.push("Hello");
stringStack.push("world");
std::cout << stringStack.pop() << std::endl; // 输出 "world"