0%

C++之模板

模板实现了类型参数化, 即把类型定义为参数, 从而真正实现了代码的可重用性. 使用模板的目的就是编写与类型无关的代码, 正是由于模板机制, STL才得以实现.

C++中的模板可分为模板函数和模板类.

模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板.

模板函数

在传统的概念中, 一个函数在定义时必须指定其参数的类型, 且该类型应该是唯一的. 此外其函数体也仅仅能对该类型的数据进行操作. 然而存在下面的情况:

int max(int x, int y){ return x < y ? y : x;}
float max(float x, float y){ return x < y ? y : x;}
string max(string& x, string& y){ return x < y ? y : x;}

上面的3个函数逻辑一致, 区别仅仅在于返回值和参数类型. 这种定义函数的方法不但冗杂而且会带来维护问题, 比如如果需要处理double类型,就需要新加入一个返回值和参数类型都是double的max函数.

模板函数则可以通过一个泛化的数据类型创建完全独立于参数数据类型的函数. 编译器会为具体的数据类型创建不同的函数版本. 下面的代码使用模板方式重新定义了上面的max函数:

template <class T>
const T& MAX(const T& x, const T& y) {
    return x < y ? y : x;
}

使用关键词template定义一个模板函数, 其后跟着一对尖括号, 里面是关键词class和一个泛化数据类型名T. 在调用模板函数时编译器会使用程序中具体指定的数据类型来替换这个泛化数据类型.

在定义和使用模板函数时,必须考虑实际的数据类型是否支持模板函数中所使用的操作.

另外模板函数可以使用不只一个泛化数据类型, 比如:

template <class X, class Y>
void output(X x,Y y) {
    cout << x << " " << y << end;
}

模板类

模板类是一种特殊类,其定义独立于特定的数据类型. 模板类的定义语法与模板函数类似:

template <class T>
class Circle
{
public:
    Circle(T centerX, T centerY, T radius);
    
    T area();
    T circumference();
    T getX();
    T getY();
    T getRadius();
    
protected:
    T x;
    T y;
    T radius;
};