泛型编程和模板
0.泛型编程
1.函数模板
2.类模板
-----------------------------------------------------------------------------------------------------------
0.泛型编程
所谓泛型就是以独立于任何特定类型的方式编写代码。前面介绍的标准库的容器、迭代器和算法都是泛型编程的具体应用。
模板是泛型编程的基础。使用模板的时候不需要知道模板是如何定义的,但今天我们来介绍如何定义自己的模板类和模板函数。
-----------------------------------------------------------------------------------------------------------
1.模板基础
函数模板
如下面的比较函数:
template <typename T> //template 和typename 都是关键字,保持不变,变的只有类型T
int cmp(T v1, T v2)
{
if(v1 > v2)
return 1
else if(v1 < v2)
return -1;
return 0;
}
cmp(10, 20);
cmp(str1, str2);
编译器将实例化cmp的两个不同的版本,使用int和string代替T来生成上述两种类型的函数。
int cmp(int v1, int v2)
{
if(v1 > v2)
return 1
else if(v1 < v2)
return -1;
return 0;
}
int cmp(string v1, string v2)
{
if(v1 > v2)
return 1
else if(v1 < v2)
return -1;
return 0;
}
可以将模板函数声明为inline函数。
如
template<typename T>
inline int cmp(T v1, T v2);
注意inline的放置位置。
-----------------------------------------------------------------------------------------------------------
2.类模板
类模板也是模板的一种,需要以关键字template开头后接模板形参表。
类模板的定义跟一般的类定义类似,可以有自己的数据成员和方法以及类型成员。还可以定义构造函数和析构函数。
只是在定义类和类的成员函数的时候,使用模板形参作为占位符,与内置类型或类类型使用方式完全一样。
template<typename T>
class myclass
{
public:
class_name();
~class_name();
T func(T& t);
private:
T m_t;
};
类模板成员函数
模板成员函数的定义需要以关键字template关键字开始,后接模板形参表。
template<typename T>
T class_name<T>::func(T& t)
{
//.....
}
实例化
模板是一个蓝图,编译器使用模板产生指定的类或函数的特定类型的版本。这个过程被称为实例化。
函数模板在调用的时候就行实例化。类模板则在使用实际模板类型时进行实例化。
如
myclass<int> obj;
编译器在编译的时候,将int类型替换myclass模板类中的形参T。
泛型编程与类模板属于高级主题,这里我们不详细介绍关于它的一些零零碎碎的知识点,介绍过多会让大家有云里雾里的感觉。
当大家对C++理解到一定程序之后再来学习类模板会有更大的收货。
下面我们来介绍一个实例。实现自己的vector类。