Logo成贤计协指南

类模板

在上一节中,我们学习了函数模板,可以让函数支持多种类型。C++ 的模板不仅可以用于函数,还可以用于类和结构体,也就是类模板

类模板允许我们定义一个“泛型类”,可以根据不同的类型参数生成不同的类实例。

类模板的语法

类模板的基本语法如下:

template <typename T>
class 类名 {
    // 类体,使用类型参数 T
};

你也可以用 class 代替 typename,效果完全一样。

例如,我们要写一个可以存放任意类型数据的盒子类:

template <typename T>
class Box {
public:
    T content;
    Box(T c) : content(c) {}
    void print() {
        std::cout << content << std::endl;
    }
};

现在,无论是 int、double、string 还是你自定义的类型,都可以用同一个类来存储:

int main() {
    Box intBox(42);
    intBox.print();

    Box doubleBox(3.14);
    doubleBox.print();

    Box strBox("Hello, World!");
    strBox.print();

    // 和函数模板一样可以显式的定义 T 的类型
    Box<int> box(114514);
    box.print();

    return 0;
}

成员函数模板(类的成员函数也能单独模板化)

除了类本身可以是模板,类的成员函数也可以单独定义为模板,即使类本身不是模板类。这让类的某些方法可以支持多种类型参数,而其他成员则保持原有类型。

class Printer {
public:
    template <typename T>
    void print(const T& value) {
        std::cout << value << std::endl;
    }
};

int main() {
    Printer p;
    p.print(123);
    p.print(3.14);
    p.print("hello");
    return 0;
}

你可以看到,Printer 类本身不是模板类,但它的 print 方法是模板函数,可以打印任意类型的数据。