萌新的学习笔记,写错了恳请斧正。
泛式编程
在C语言笔记#22中,我们提到了泛式编程可以减少对特定数据类型的依赖,并且使用泛型指针void*
在C语言中实现了一个“万能”的冒泡排序。而在C++中,泛式编程更加容易,因为C++提供了模版这么一个概念。
函数模板
一个函数模板就代表了一个函数家族,函数模板与类型无关,只在使用时才被参数化,根据参数的类型来产生函数的特定版本。
如果我们想在函数中使用未定的类型,我们只要在函数的声明和定义前各加上一行template语句。
template语句的格式为:
template <typename T1, typename T2, ..., typename Tn>
//下面直接接模版函数的本体即可,本体中就可以利用我们设置的模版类型T1,T2……
//这里typename也可以替换为class,但是这样不符合自然语言逻辑:
template <class T1, class T2, ..., class Tn>
比方说如果我们想写一个任意类型的加法函数,只需要这样:
template <typename T>
T add(T a, T b)
{
return a + b;
}
但是这里要求参数a和参数b是同一个类型的变量,如果我们的函数涉及到多个互不关联的未定的类型,就需要在template的形参列表中加上一些东西,比方说写一个比较两个类型变量的内存大小的函数:
template <typename T1, typename T2>
bool TypeSizeBigger(T1 x, T2 y)
{
return (sizeof(x) > sizeof(y)) ? true : false;
}
函数模板的实例化
在编译阶段,编译器根据传入模板的实参类型来推演生成对应类型的函数以供调用。
比方说对于上面的add函数在程序中实际有三种类型传入进来调用。那么编译器实际上在编译时就根据模板生成了三个仅类型不同的函数,每一个用于处理不同的类型的调用。用不同类型的参数使用函数模板是,也称为函数模板的实例化。
实例化分为隐式实例化和显示实例化:
隐式实例化
隐式实例化就是让编译器根据实参自己推演模板参数的实际类型。
template <typename T>
T Add(const T& a, const T& b)
{
return a + b;
}
int main()
{