跳转到主要内容
模块 8 · 第 2 课(共 2)课程中的18/18~15 min
模块课程(2/2)

类模板

就像函数一样,类也可以针对一种或多种数据类型进行参数化。这使我们能够定义适用于任何数据类型的通用数据结构(例如列表、队列、堆栈或包装器),而无需重复代码。

定义类模板

为了声明类模板,我们在类定义之前使用 template <typename T> 语法。在类内部,我们可以使用类型参数 T 来定义成员变量、返回类型或成员函数参数。

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

    T getValue() const {
        return value;
    }
};

实例化

创建类模板的对象时,我们必须在尖括号 <> 之间显式指定类型(尽管从 C++17 开始,编译器可以在某些上下文中通过 Class Template Argument Deduction 或 CTAD 推导它):

C++
Box<int> intBox(10);        // T becomes int
Box<double> doubleBox(3.14); // T becomes double

模板专业化

有时,当使用特定类型实例化类模板时,我们希望类模板有不同的行为。在这种情况下,我们使用 template <> 语法定义完全专业化,后跟指定目标类型的类定义:

C++
// Total specialization for the bool type
template <>
class Box<bool> {
private:
    bool value;
public:
    Box(bool v) : value(v) {}

    void printState() {
        std::cout << (value ? "True" : "False");
    }
};

自己尝试一下

锻炼#cpp.m8.l2.e1
尝试:0加载中...

声明一个名为 Box 的类模板,其中包含一个名为 T 类型的私有成员 value、一个初始化该成员的构造函数以及一个返回该值的公共方法 getValue() const。

正在加载编辑器...
显示提示

请记住将“template <typename T>”添加到“Box”类声明中。

3 次尝试后可用的解决方案

锻炼#cpp.m8.l2.e2
尝试:0加载中...

声明一个类模板 Wrapper<T>,其中包含类型 T 的公共成员数据、构造函数 Wrapper(T d) 以及将数据打印到 std::cout 的 print() 方法。接下来,为 Wrapper<char> 创建一个完全特化,其中 print() 方法打印用单引号括起来的字符(例如,'A' 而不是 A)。

正在加载编辑器...
显示提示

使用“template <>”来指示“Wrapper<char>”的完全专业化。

3 次尝试后可用的解决方案