C++中的模板是什么?

  • Post category:cplus

C++中的模板是一种在编译时进行类型转换、生成代码的元程序方式。通过使用模板,可以在一定程度上解决代码重复问题,比如实现多个相似函数或类的情况。模板分为函数模板和类模板两种。

函数模板

函数模板是一种用于生成函数定义的模式或蓝图,它能够以通用的方式编写代码,从而消除了很多重复的代码。函数模板采用模板参数来代表类型或值,这些模板参数会在编译时被实例化成具体的类型或值。定义函数模板使用template关键字,例如:

template <typename T>
T max(T x, T y) {
    return (x > y ? x : y);
}

上面的max函数是一个简单的函数模板,它接收两个类型相同的参数,并返回它们中的较大值。函数模板的类型参数通常用typename表示。

可以在调用函数时指定具体的类型参数,例如:

int max_int = max<int>(3, 5);
double max_double = max<double>(3.14, 1.414);

在上面的示例中,max函数被实例化成了两个不同类型的函数,一个返回int类型的结果,一个返回double类型的结果。

类模板

类模板是用于生成类定义的模式或蓝图,它使得我们可以以通用的方式编写类,从而抽象出类的共性部分,实现代码的重复使用。类模板定义使用template关键字,例如:

template <typename T>
class Stack {
private:
    T* data;
    int top;
    int size;
public:
    Stack(int s) {
        data = new T[s];
        top = -1;
        size = s;
    }
    void push(T x) {
        if (top < size - 1) {
            data[++top] = x;
        }
    }
    T pop() {
        if (top >= 0) {
            return data[top--];
        }
    }
};

上面的Stack类是一个简单的类模板,它代表一个栈。类模板中的T就是一个通用的类型参数,用于代表栈中的元素类型。使用时可以通过指定类型参数来实例化Stack类,例如:

Stack<int> int_stack(10);
int_stack.push(5);
int_stack.push(10);
int num = int_stack.pop();

Stack<double> double_stack(10);
double_stack.push(3.14);
double_stack.push(1.414);
double num = double_stack.pop();

在上面的示例中,我们分别实例化了一个int类型的栈和一个double类型的栈,它们使用的是同一个类模板Stack,但是类型参数不同。