模板基础
函数模板、类模板、typename vs class、模板特化
模板基础
模板是 C++ 的泛型编程核心——写一次代码,适用任意类型。没有模板就没有 STL。
学完本章你将: 掌握函数模板、类模板、typename vs class、模板特化。
函数模板
cpp
#include <iostream>
// 不用模板——要为每个类型重写一份
int maxInt(int a, int b) { return a > b ? a : b; }
double maxDouble(double a, double b) { return a > b ? a : b; }
// 用模板——写一次,适用所有类型
template <typename T>
T max(T a, T b) {
return a > b ? a : b;
}
int main() {
std::cout << max(3, 5) << "\n"; // 自动推导为 int
std::cout << max(3.14, 2.72) << "\n"; // 自动推导为 double
std::cout << max(std::string("abc"), std::string("abd")) << "\n";
return 0;
}
类模板
cpp
template <typename T>
class Box {
T value;
public:
Box(T v) : value(v) { }
T get() const { return value; }
void set(T v) { value = v; }
};
int main() {
Box<int> intBox(42);
Box<std::string> strBox("Hello");
std::cout << intBox.get() << "\n";
std::cout << strBox.get() << "\n";
return 0;
}
模板特化
cpp
// 通用版本
template <typename T>
T max(T a, T b) { return a > b ? a : b; }
// 针对 const char* 的特化版本
template <>
const char *max<const char *>(const char *a, const char *b) {
return strcmp(a, b) > 0 ? a : b;
}
typename vs class
cpp
// 这两种写法完全等价
template <typename T> void f(T t);
template <class T> void f(T t);
// 惯例:typename 强调任意类型,class 历史遗留
// 现代代码建议用 typename