Z
ZHANK
模板与 STL

模板基础

函数模板、类模板、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