Skip to content

模板

1. 定义

在 C++ 中,模板(Template)是一种参数化的类型,它允许在不知道具体类型的情况下定义类或函数。模板可以用于创建泛型类(可以用于多种数据类型的类)或者泛型函数。这使得代码更加灵活和可重用。

2. 函数模板

函数模板允许在编写一个函数时使用一个或多个类型参数,这些类型参数在调用函数时由实际使用的类型来确定。

例如,下面是一个简单的函数模板示例:

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

这里 max 函数可以接受任何类型的 a 和 b,只要它们支持比较操作符。

3. 类模板

类模板允许你定义一个类,这个类的某些部分是依赖于类型参数的。当使用类模板创建对象时,必须指定类型参数,这样编译器就能生成具体的类。

C
template <typename T>
class Stack {
private:
    std::vector<T> elements;

public:
    void push(T const& item) {
        elements.push_back(item);
    }

    T pop() {
        T result = elements.back();
        elements.pop_back();
        return result;
    }

    bool empty() const {
        return elements.empty();
    }
};

// Stack 可以用来创建任何类型的栈,比如整数栈 Stack<int> 或者字符串栈 Stack<std::string>。

4. 模板特化

有时候可能需要为特定的数据类型提供不同的实现,这时你可以使用模板特化(Specialization)。模板特化允许为特定类型提供不同的定义。

例如,对于 std::string 类型,你可能会想要提供一个不同的 max 函数实现:

C
template <>
std::string max<std::string>(std::string a, std::string b) {
    return a.length() > b.length() ? a : b;
}

5. 非类型模板参数

除了类型参数之外,C++ 还支持非类型模板参数,即可以在模板声明中传递常量表达式。

C
template <int N>
class ConstantClass {
public:
    static int getConstantValue() { return N; }
};

在这个例子中,N 是一个非类型模板参数,可以用来传递常量值。 使用模板时要确保你的编译器支持你所需要的 C++ 标准版本,因为模板的一些特性是在 C++ 不同版本中逐步引入的。

Released under the MIT License.