📜  C++中的模板(1)

📅  最后修改于: 2023-12-03 15:14:03.756000             🧑  作者: Mango

C++中的模板

在C++中,模板是一种通用编程工具,它可以用来生成通用的函数和类,从而实现代码的重用。模板代码并不是真正的代码,而是代码的模板或者蓝图,它在使用时会被替换成具体的代码。

函数模板

函数模板可以用来定义一组通用的函数,这些函数在功能上是相同的,但是参数类型不同。函数模板的语法如下:

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

在这个例子中,我们定义了一个名为max的函数模板,接收两个类型为T的参数,并返回T类型的值。typename关键字可以用class替代,表示接受任意的数据类型。

使用函数模板时,我们可以按如下方式调用:

int a = 10, b = 20;
cout << max(a, b) << endl;   //输出20

double c = 3.14, d = 2.72;
cout << max(c, d) << endl;   //输出3.14

在这个例子中,我们分别调用了max函数模板,传入了不同类型的参数。在编译器编译程序时,会根据传入的参数类型自动选择合适的模板进行编译。

类模板

类模板与函数模板类似,可以用来定义一组通用的类,这些类在功能上是相同的,但是成员变量和方法的类型不同。类模板的语法如下:

template <typename T>
class MyArray {
private:
    T* elements;
    int size;
public:
    MyArray(int size) {
        this->size = size;
        this->elements = new T[size];
    }
    ~MyArray() {
        delete[] elements;
    }
    T& operator[](int index) {
        return elements[index];
    }
    int getSize() {
        return size;
    }
};

在这个例子中,我们定义了一个名为MyArray的类模板。它有一个类型为T的成员变量elements,一个int类型的成员变量size,以及一组操作这些成员变量的方法。

使用类模板时,我们需要在类名后加上尖括号<>,并传入具体的数据类型。例如:

MyArray<int> array(10);
for (int i = 0; i < array.getSize(); i++) {
    array[i] = i + 1;
}

在这个例子中,我们创建了一个MyArray对象,数据类型为int,并且容量为10。然后我们循环遍历数组并给每一个元素赋值从1到10。

模板特化

有时候我们需要对某些特殊的数据类型进行特殊的处理,这时候我们可以使用模板特化来处理这些情况。模板特化就是为模板的某些特定类型提供专门的实现。

例如,我们可以为char*类型的字符串提供一个特化的max函数模板:

template<>
const char* max<const char*>(const char* x, const char* y) {
    return strcmp(x, y) > 0 ? x : y;
}

在这个例子中,我们针对const char*类型的数据作了特化处理。如果传入的参数是这个类型的数据,则返回这两个字符串中较大的那个。注意,我们需要在函数名后面加上尖括号<>,并传入具体的数据类型。

模板实例化

在使用模板时,编译器并不会自动将模板代码编译成可执行代码,而是要等到实际使用时才会实例化出具体的代码。这个过程叫做模板实例化。

模板实例化可能会导致代码体积增大,因为编译器需要为每种使用方式都生成一份具体的代码。如果程序中使用了大量的模板,会严重影响构建和运行时间。

因此,我们可以在具体实例化之前,使用extern template关键字将模板进行显式实例化,从而避免重复实例化导致的代码体积过大。例如:

//声明MyArray<int>实例
extern template class MyArray<int>;

//使用MyArray<int>实例
MyArray<int> array(10);

在这个例子中,我们先声明了一个MyArray<int>的实例,然后才创建了一个实际的实例。这样就只会生成一份MyArray<int>的代码。

总结

模板是C++中的一种通用编程工具,可以用来生成通用的函数和类,从而实现代码的重用。使用模板可以极大地提高程序的开发效率。需要注意的是,模板的实例化可能会导致代码体积过大,因此需要进行控制。