C++ Academy · 课时

函数与类模板再探

使用正确的模板语法编写泛型函数和类

第 1 / 4 课14 个步骤

函数与类模板再探 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。

为什么使用模板

模板让您只需编写一次代码,编译器便会为所使用的每种类型生成特定版本。这是泛型编程的基石。

函数模板语法

使用 template <typename T> 声明类型参数。在函数签名中使用 T。

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

std::cout << max_of(3, 7);          // int
std::cout << max_of(2.5, 1.5);      // double

typename 与 class

关键字 typename 和 class 在模板参数声明中可以互换。在现代代码风格中,更常使用 typename。

多个类型参数

模板可以包含多个类型参数。

template <typename T, typename U>
auto combine(T a, U b) -> decltype(a + b) {
    return a + b;
}

非类型参数

模板参数也可以是非类型值:整数、枚举或指针。

template <typename T, size_t N>
struct StaticArray {
    T data[N];
};

StaticArray<int, 10> arr;

类模板

泛型类使用相同的模板语法。请使用类型参数定义成员和方法。

template <typename T>
class Stack {
    std::vector<T> data_;
public:
    void push(T x) { data_.push_back(std::move(x)); }
    T pop()        { T t = std::move(data_.back()); data_.pop_back(); return t; }
};

Stack<int> s1;
Stack<std::string> s2;

类外的成员函数

在类外定义成员时,需要在每个成员前加上模板前缀。

template <typename T>
class Stack {
public:
    void push(T x);
};

template <typename T>
void Stack<T>::push(T x) {
    data_.push_back(std::move(x));
}

默认模板实参

这与函数默认实参类似。调用方未指定时使用默认值。

template <typename T = int>
class Box {
    T value;
};

Box<> b;       // T is int

模板实参推导

编译器通常可以根据调用推导模板实参。

template <typename T>
void print(T x) { std::cout << x; }

print(42);          // T deduced as int
print("hello");    // T deduced as const char*
print<double>(3);   // explicit

类模板实参推导(C++17)

C++17 允许您在可以根据构造函数进行推导时省略类模板实参。

std::pair p(1, 2.5);            // pair<int, double>
std::vector v{1, 2, 3};         // vector<int>

两阶段查找

模板分两个阶段进行查找——定义阶段(非依赖名称)和实例化阶段(依赖名称)。这可以在定义时发现许多错误。

错误消息

模板错误可能令人望而生畏。请从下往上阅读,重点查看源代码位置,并使用 C++20 概念改善诊断信息。

快速检查

哪项特性使 std::vector v{1, 2, 3}; 无需指定 std::vector<int> 就能编译?

回顾

模板在编译时生成特定于类型的代码。使用 template <typename T> 定义函数模板和类模板。编译器会在可能时推导实参——需要时请显式指定。

免费开始

用 AI 导师学习 C++ — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
51
课程
203

常见问题解答

「函数与类模板再探」课时是免费的吗?

是的 — 「函数与类模板再探」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。

「函数与类模板再探」这节课中我会学到什么?

使用正确的模板语法编写泛型函数和类 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C++ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「函数与类模板再探」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C++ Academy 课中编写并运行代码吗?

能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 函数与类模板再探
  2. 模板特化:偏特化与全特化
  3. 可变参数模板与参数包
  4. constexpr 函数与 if constexpr
← 返回 C++ Academy