// ===== CodeLab: C++ 模板入门 =====
// 来源: https://aoerliang.dpdns.org/articles/cpp-templates
// 以下代码片段按文章出现顺序拼接, 共 5 段

// ----- 片段 1 (cpp) -----
template <typename T>
T my_max(T a, T b) {
    return a > b ? a : b;
}

int main() {
    cout << my_max(3, 7);          // T 推导为 int
    cout << my_max(3.5, 2.1);     // T 推导为 double
    cout << my_max('a', 'z');     // T 推导为 char
}

// ----- 片段 2 (cpp) -----
template <typename T, typename U>
auto add(T a, U b) -> decltype(a + b) {   // C++11 尾置返回类型
    return a + b;
}
// 更简洁:C++14 起直接用 auto
template <typename T, typename U>
auto add2(T a, U b) { return a + b; }

// 显式指定类型(模板参数无法推导时)
auto v = my_max<double>(3, 2.5);

// ----- 片段 3 (cpp) -----
template <typename T>
class MiniStack {
    vector<T> data;
public:
    void push(const T& v) { data.push_back(v); }
    void pop() { data.pop_back(); }
    T& top() { return data.back(); }
    bool empty() const { return data.empty(); }
};

MiniStack<int> s1;
MiniStack<string> s2;   // 同一份代码,两种类型

// ----- 片段 4 (cpp) -----
// 全特化:为特定类型提供专用版本
template <>
const char* my_max(const char* a, const char* b) {
    return strcmp(a, b) > 0 ? a : b;   // 按内容比较
}

// ----- 片段 5 (cpp) -----
template <typename T, size_t N>
class FixedArray {
    T arr[N];              // N 是编译期常量
public:
    size_t size() const { return N; }
    T& operator[](size_t i) { return arr[i]; }
};

FixedArray<int, 8> buf;    // 8 个 int 的定长数组
