C++ 模板

泛型编程

泛型编程是一种针对一些具有相似功能,但是细节存在一些不同的情况而设计出来的一种风格或者说范式。

我们使用C语言实现数据交换的函数:例如对a, b两个变量的值进行交换

复制代码
void swap(int a, int b)
{
    int c=a;
    a=b;
    b=c;
}

像这样我们就完成了对整形a,b的交换,但是这两个变量并不一定就是整形,或者说并不是只有整形需要用到这个功能,还有double,float,char或者自定义类型都可能会有这个需求,若是C语言的话我们就只能每个类型都编写一份差不多的函数,这就会增加工作量,而C++就针对这点进行了改良引入了泛型编程,就是我们只需要写一份代码就可以完成对所有这些类型数据的交换大大减少了工作量。

函数模板

模板就是对泛型编程的实际运用,我们只需要设计一个模板类型,由编译器来根据模板来完成对对应类型数据的函数生成,所以这并不是说我们不需要针对其他数据类型去生成对应的函数,而是将这份工作交给编译器去完成,而我们就只需要为编译器提供一份通用的模板即可。

复制代码
template<class T>
void swap(T& left,T& right)
{
    T tmp=left;
    left=right;
    right=tmp;
}

这就是一份通用模板,没有明确类型而是由T来代替类型的位置,第一行是对类型的定义用template<class type>这里的type就是用于替代类型的,上面的T其实换成其他的都可以,些什么是无所谓的,T是type的缩写所以很多会习惯使用T来替代,class也可以换成typename,这两个是等价的。

复制代码
int main ()
{
    int a=1;
    int b=2;
    swap(a,b);


    float f=11.2;
    float j=22.1;
    swap(f,j);

    
    return 0;
}

这样子就能完成对模板函数的调用。

如上虽然两次的数据类型是不相同的,但是能通过同一种调用方式去调用swap函数来完成交换。

函数模板还可以通过显示实例化的方法规定类型

复制代码
int main()
{
    double a=2.0;
    double b=3.0;
    swap<int>(a,b);
    
    return 0;
}

如此也是可以的,这样会根据int类型生成模板函数。而对参数会进行隐式类型转化,若是无法隐式类型转化的就会报错。

特化

针对特定类型可能会有不一样的处理方式,这是我们可以单独实现这个函数这个叫做特化,例如我们已经有了swap的函数模板了

复制代码
void swap(string & a,string& b)
{
    char c=a[1];
    a[1]=b[1];
    b[1]=c;
}

再单独写一份关于string的函数这样就完成特化,当我们传递的参数是符合这个函数的参数的时候会优先匹配到这个函数而不会通过函数模板再生成一份,也可以理解为提供了一个重载版本的函数。

类模板

类与函数模板不同,类模板在实例化的时候需要显示实例化,即在定义对象的时候是需要带上实例化的类的模板类型的。

我这个pop_back函数是在类模板内声明然后在外部实现的,在外部实现时是需要将模板类型带上的。

相关推荐
smallswan2 分钟前
《Rust七十二变》开源了
开发语言·后端·rust·ai编程
闻道且行之39 分钟前
图片处理助手|C++ 手搓离线 AI 抠图工具,U2Net 原理到落地一次讲透
开发语言·c++·人工智能·神经网络·opencv·计算机视觉
三言老师41 分钟前
K8s集群运行时异常趋势分析预警实操
java·开发语言·kubernetes
玖釉-1 小时前
nvpro_core2 源码与架构解析:NVIDIA Vulkan 图形开发基础框架
c++·windows·图形渲染
秋田君1 小时前
QT_一个UDP通信程序(单播+广播)
开发语言·qt·udp
临床数据科学和人工智能兴趣组1 小时前
R语言中,列表是一种非常灵活的数据结构,它可以存储不同类型的对象,如向量、矩阵、数据框、甚至其他列表
数据结构·数据库·r语言·r语言-4.2.1·临床试验
qq_22589174661 小时前
基于Flask的空气质量监测与预测分析系统
开发语言·后端·python·信息可视化·django·flask
啦啦啦啦啦zzzz1 小时前
高级I/O函数(一)
linux·服务器·网络·c++·网络编程
lhldsg2 小时前
社区健身系统开发实战:从需求分析到落地部署全流程指南
java·开发语言·小程序·需求分析
李高钢2 小时前
C# WPF Prism 进阶(三):导航(Navigation)深入
开发语言·c#·wpf