C++ Template 基础篇(一):函数模板_函数模板的定义及使用-优快云博客
这篇博客提到模板是泛型编程的基础,把类型也当做参数,这样使得静态类型语言对类型的处理更强大,提高了代码的可重用性,目标和软件工程一致,提供可复用的代码
本章可以学到下面内容:
Function Templates
函数模板本身不是函数,它是一种“食谱”或者“图纸”,表示一系列的函数声明;模板是参数化的函数定义,函数的实例需要有参数才可以创建,也就是说非必要时不会生成函数定义
由函数模板生成函数的过程叫作实例化instantiation,模板的参数通常是类型,但也有可能是其他一些值,比如维度等
我们来看一个之前提到过的例子,函数模板语法大致如上,尖括号里是模板参数,然后把这里声明的参数当做正常类型使用即可
这里的T叫做模板类型参数,我们可以用typename关键字,也可以用class关键字,但是更推荐前者
Creating Instances of a Function Template
举个使用的例子↑
可以看到我们就像使用普通函数一样使用函数模板,T一般是不需要我们指定的,编译器会去进行推导,这种机制叫模板实参推导;编译器首先查找有没有double参数的larger版本函数,如果没有就会通过模板实例化生成一个double larger()
直到这里,实例化的过程就完成了;每个版本的函数只会生成一次,即使不同文件都包含类似的模板;再举一个例子:
Template Type Parameters
一般提到parameter,指的都是形参,是函数定义时的理想参数,而不是调用函数时传入的那个值
形参T可以实例化为很多类型,前面说过string不适合复制,所以我们可以使用const引用来写这个比较大小的函数:
事实上标准库里有一对max、min函数的实现逻辑就和这个例子类似:
Explicit Template Arguments
这里强调的是当调用实例的时候实参类型和模板矛盾的情况,举个例子:
这个larger我们用一个int和一个double传入函数再看,发现编译不通过,提示对于类型T有两个矛盾的推导类型,这说明