目录
1.什么是函数模板:
- 在实际应用中我们可能会对不同类型的对象实现同一种类型的运算,如果我们用函数重载将函数参数设置为不同类型其实也可以实现,但是这无疑会让代码的复用率变低,所以在C++中就推出了模板。函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
2.模板的使用
- 我们测试一下自定义类型可不可以使用模板
- 模板的隐式类型转化和显式类型转化
3.模板的规则:
- 1.一个非模板函数和模板函数同时存在时,如果调用函数时传递的参数与非模板函数的参数相同时,就会直接调用非模板参数
- 但是如果模板函数比非模板函数可以产生更好的匹配函数,就会调用模板函数
- 可以看到就会调用模板函数。
- 2. 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换
- 3.一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数
4.模板函数
- 4.1.template<class T>//T:类型参数
- 4.2.template<class T,size_t N>//T:类型参数 N:非类型参数,实际是一个常量
- 【注意】
- 1.浮点数,类对象,以及字符串是不允许作为非类型模板参数的。
- 2.非类型的模板参数必须在编译期间就可以确认结果。
5.模板特化
- 概念:
- 我们的模板是可以解决绝大多数问题的,但是在一些特殊的情况下有一些问题无法用通用的模板解决,这时我们就需要将模板特化,用来解决特殊情况下的问题。例如下面的情况:
- 这里我们是想比较两个字符串的大小,但是我们这里传入的是两个指针,那么到时候在比较时,比较的是指针中保存的地址的大小,而不是字符串的大小,这里我们就需要对模板进行特化
- 当然我们也可以直接写一个非模板类型的函数这样更加简便,当遇到特殊类型时直接调用非模板类型的函数
6.类模板特化
-
6.1全特化:
- 将模板参数列表中所有参数都确定化
-
6.2偏特化:
-
任何针对模版参数进一步进行条件限制设计的特化版本。比如对于以下模板类:
- 还可以进一步进行条将限制设计的特化版本
7.类模板的应用:
- 类型萃取
8.模板的分离编译
- 模板的分离编译其实就是指模板的声明在头文件中,而其实现在其他源文件中,这就会导致在其他文件中如果调用模板但是并不实例化模板时就会出现错误。
-
如果看到这里觉得有用不如就点个赞再走吧!!!