非常棒的主题!以下是《C++从入门到实战(十三)C++函数模板与类模板初阶讲解》的完整教学文案,适合用于视频讲解、图文课程、PPT编写或公众号推文。内容通俗清晰,注重实战和理解。


💡C++从入门到实战(十三):C++函数模板与类模板初阶讲解

C++ 模板是泛型编程的核心。学会它,你将能写出更灵活、可复用、类型无关的代码!这一章,我们一起从函数模板讲起,逐步掌握类模板,为掌握 STL 奠定基础!


🧠 一、什么是模板?

模板(Template)是 “泛型编程” 的核心技术,它允许函数或类处理任意类型的数据

📌为什么要用模板?

  • 编写通用代码,减少重复
  • 提升程序可维护性
  • 是 STL(标准模板库) 的基础
  • 函数和类都可以模板化

🔧 二、函数模板入门

✅ 定义语法

template<typename T>
T Max(T a, T b) {
    return a > b ? a : b;
}

✅ 使用方式

int main() {
    std::cout << Max(3, 5) << std::endl;        // 推导出 T=int
    std::cout << Max(2.5, 7.1) << std::endl;    // 推导出 T=double
}

📌注意事项:

  1. 模板会根据实参自动推导类型
  2. 可以手动指定类型:Max<int>(3, 5);
  3. 两个参数类型必须相同(或能隐式转换)

💡 三、函数模板 vs 函数重载

int Max(int a, int b) {
    return a > b ? a : b;
}

double Max(double a, double b) {
    return a > b ? a : b;
}

⬆️写两个函数不如写一个模板函数⬇️

template<typename T>
T Max(T a, T b) {
    return a > b ? a : b;
}

🧱 四、类模板入门

✅ 定义语法

template<typename T>
class Box {
private:
    T value;
public:
    Box(T v) : value(v) {}
    T getValue() const { return value; }
};

✅ 使用方式

int main() {
    Box<int> intBox(100);
    Box<std::string> strBox("Hello");

    std::cout << intBox.getValue() << std::endl;
    std::cout << strBox.getValue() << std::endl;
}

🧰 五、类模板中的成员函数实现

✅ 类外实现写法

template<typename T>
class Box {
private:
    T value;
public:
    Box(T v);
    T getValue() const;
};

template<typename T>
Box<T>::Box(T v) : value(v) {}

template<typename T>
T Box<T>::getValue() const {
    return value;
}

📌注意:每个成员函数定义都要写上 template<typename T> 和 Box<T>::


🔍 六、模板参数支持多个类型

template<typename T1, typename T2>
class Pair {
public:
    T1 first;
    T2 second;

    Pair(T1 a, T2 b) : first(a), second(b) {}
};
int main() {
    Pair<int, std::string> p(1, "One");
    std::cout << p.first << ", " << p.second << std::endl;
}

🔄 七、模板的自动推导 & 显式指定

函数模板中可以:

template<typename T>
T add(T a, T b) { return a + b; }

int main() {
    std::cout << add(2, 3) << std::endl;       // 自动推导为 int
    std::cout << add<double>(2, 3.5) << std::endl; // 显式指定为 double
}

🧩 八、实战案例:通用排序函数模板

template<typename T>
void mySwap(T& a, T& b) {
    T temp = a;
    a = b;
    b = temp;
}

template<typename T>
void mySort(T arr[], int size) {
    for (int i = 0; i < size - 1; ++i)
        for (int j = i + 1; j < size; ++j)
            if (arr[i] > arr[j])
                mySwap(arr[i], arr[j]);
}
int main() {
    int arr[] = {5, 2, 8, 3};
    mySort(arr, 4);
    for (int i : arr)
        std::cout << i << " ";
}

✅ 不同类型都可用:mySort<double>()mySort<std::string>()


🎯 九、模板常见问题汇总

问题解答
可以多个模板参数吗?可以,常见于 Pair、Map 等
类模板可嵌套使用吗?可以,例如 std::vector<std::pair<int, int>>
模板能用于成员函数吗?可以,且可类内或类外实现
模板能指定默认类型吗?可以,template<typename T = int>

✅ 十、本节小结

内容要点
函数模板实现通用算法
类模板封装泛型类,如 Box、Pair
关键语法template<typename T>,类外需加 Box<T>::
使用场景写通用容器、算法、工具类

📚 下一节预告:

第十四讲:深入 STL 容器模板设计思想,探秘 vector / list / map 的模板内部结构


如你需要这套教程的 Markdown 源码、PDF、配套 PPT 或配图思维导图,也可以告诉我,我能帮你完整整理!是否要继续下一讲?