函数与类模板再探
使用正确的模板语法编写泛型函数和类
函数与类模板再探 是 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); // doubletypename 与 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 反馈 — 无需本地设置。