|
发表于 2025-2-21 10:45:08
|
显示全部楼层
2 模板包括:函数模板和类模板
模板参数列表的写法:template <typename T1,typename T2,...>,其中typename代表任意类型和class可以等价替换
函数模板和类模板的写法:就是在模板的下面写一个使用T1 T2的函数或者类
函数模板的特点:可以和其他函数模板和普通函数形成重载,调用的时候普通函数的优先级大于函数模板
函数/类模板的实例化:
包含:隐式和显式实例化
显式实例化:
含义:就是显式的写出指定类型的函数/类模板声明
代码:template 类型 名字<>(),<>内写出指定类型,()中如果有typename类型的变量,直接显式的写出来类型,没有就不写
注意:如果某种类型的显式实例化没有写,那么调用这种类型的函数/模板类就会出错
隐式实例化:
含义:不显示的写出来指定类型的模板声明,在调用的时候写指定的类型
函数模板和类模板在模块化结构中:不能分为头文件和实现文件,但是要避免头文件臃肿可以:在头文件的声明后紧挨着#include "实现文件名字"
类模板的实例化:类名<typename T1,typename T2,...> 对象;
类模板的综合使用:
已知定义了一个类模板A,里面有各种函数,如果在类外进行具体实现?
tmplate<参数类型 参数名>
函数类型 类名<参数名,参数名>::函数名(参数类型 参数名){
}
类模板中可以定义函数模板或类模板类型的成员模板,成员模板不能是虚的
模板的特化: 包含:全特化和偏特化(也叫部分特化)
含义: 全特化:就是再写一个同名的模板且给模板的通常参数T指定特定类型 部分特化:给模板参数指定特殊情况的实现
怎么写?:
1模板参数列表写成template <>
2类或函数名后面加<指定类型>
模板参数:
模板的参数类型: 可以是类型参数T,可以是指定整形参数,也可以有默认值
模板可变参数:
含义:可以让模板的参数类型的个数和参数的个数可变
写法:
打包和解包:
打包:是在函数模板参数列表中定义参数包的过程
解包:是在函数调用中使用 ... 语法将参数包展开放入函数调用之中的过程
解包关键代码:args...
解包通常用于:递归调用(args...) 的时候
解包递归调用代码:
template <typename T, typename ...Args> // 模板参数列表
函数为:
void print(T t1, Args ...args) { // 函数参数包
cout << t1 << " "; // 打印第一个参数
print(args...); // 递归调用,打印余下的参数
}
调用print(1,"yunfan");的时候会输出1 yunfan 和一个print()的输出,所以一定要在函数模板前写一个无参print
模板的位置:通常在全局,或者在类中
|
|