一.函数模板
1.抽象
先来例子:
template <typename T, typename S>
auto add(T x1, S x2)//C++14
{
return (x1+x2);
}
以上就是一个函数模板,也是对类型的参数化。
这种类型的抽象可以用于函数返回值、局部变量和函数参数中。
2.实例化
int main()
{
auto y = add(1, 2.0);
return 0;
}
以上就是一种函数模板实例化,即模板函数。
实际上,函数模板实例化有显式和隐式两种。
显式实例化
强制某些函数实例化,可出现于程序中模板定义后的任何位置。
template <typename T>
void f(T a)
{
std::cout << a << '\n';
}
template void f<double>(double);
template void f<>(char);
template void f(int);
隐式实例化
#include <iostream>
template<typename T>
void f(T a)
{
std::cout << a << '\n';
}
int main()
{
f<double>(1);
f<>('a');
f(7);
void (*ptr) (std::string) = f;
}
二.类模板
1.抽象
让我们来看看这两段关于类定义的代码
class intarray
{
int* it;
int size;
public:
intarray(int arraysize);
int GetMax();
int GetMin();
int GetSize(){return size;}
};
class floatarray
{
float* it;
int size;
public:
floatarray(int arraysize);
float GetMax();
float GetMin();
int GetSize(){return size;}
};
这两个类的内涵十分相似,差别仅在于元素类型不同,其他地方十分相似。若将类型作为参数,就可能用另一个抽象结构产生这两个类乃至更多的array类。
下面开始将类型参数化,即抽象出来
template<class T>
class Array
{
T* ptdata;
int size;
public:
Array(int arraysize);
T GetMax();
T GetMin();
int GetSize(){return size;}
};
一个类是一组对象的抽象,一个类模板是一组类的抽象。
引入类模板的目的:对结构特征和行为特征相似,但成员的类型不能保证相同的一组类,进行高一级的抽象,以提高程序的重用性和规格化程度。
类模板的一个重要作用是对类库提供了强有力的支持。
2.实例化
对上述的类模板进行实例化
Array<int> intarray(10);
//类模板生成的实例(类)及其实例(对象)的生成和操作