前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >c++模板与泛型编程

c++模板与泛型编程

原创
作者头像
腹黑熊
修改2022-04-27 10:08:58
8310
修改2022-04-27 10:08:58
举报
文章被收录于专栏:大熊爱学习大熊爱学习

最近复习下c++的模板,在这里简单记录先个人对泛型编程和模板的理解,主要针对模板的目标,原理以及场景做分析,欢迎站内大佬做指导和补充。

泛型编程与模板的设计目标

泛型编程的目标是编写可重用的代码,而在c++中泛型编程的工具就是模板。普通函数参数化值,可以编写不依赖特定值的算法;模板参数化类型,可以编写不依赖特定类型的函数和类。核心都是代码复用


模板的底层原理

模板利用了代码生成的方式实现代码复用,编译器将代码中每个实例化的模板使用的类型放在模板定义中进行替换,并生成对应代码进行编译。编译器生成代码的方式就好像语言不支持模板时程序员编写代码的方式:为每个类型编写一个不同的类。模板只是把这个枯燥的手工过程自动化了,如果没有实例化任何类型的话,编译器就不会生成任何代码。


模板的使用场景

如果问模板适合怎样的场景,以我个人的理解:针对模板类,任何需要通过在类外面再套一层类的方式解决问题的,或者需要对大量同类型对象进行管理的,并且不针对特定类型的方式都可以使用模板。依据此原则可以分为两类,容器类包装类

容器类

典型的如标准库中的std::vector、std::list和std::map之类的,利用各自的数据结构对大量同类型对象进行管理。

包装类

包装类的实现方式就比较多种多样了,没有特定的套路,针对不同的问题场景有不同的应用。这里尝试列出标准库中常用的实现供参考,自己编写代码时也可以借鉴这里的思路。

业界有一个经典言论:"All problems in computer science can be solved by another level of indirection." ---david wheeler。感觉这句话很适合对包装类的描述。

  • 智能指针 利用变量的生存期进行动态对象的管理和释放。
  • std::unique_lock、std::lock_guard和std::scope_lock等 利用变量的生存期对互斥量进行加锁和释放。
  • std::reference_wrapper 在一个可移动可复制的类型中保存目标对象的引用,用于一些无法传引用的场景中去访问原始对象。 - 场景1:在新线程函数中访问原始线程的参数。新线程的参数是由原始线程中复制(或移动)得到的,直接使用时无法访问和修改原始参数的。利用std::ref返回std::reference_wrapper,可以实现在复制和移动的过程保持原始参数的引用不变,实现对原始参数的访问和修改。 - 场景2:在vector中存储数据的引用。在向vector中正常添加数据时,是对原始数据的复制或移动,包括动态扩容时的复制或移动操作,都会导致无法访问原始数据。这里依然是使用std::reference_wrapper,在复制和移动的过程保持原始数据的引用不变,实现对其访问和修改。
  • std::pair和std::tuple 简单的组合,将两个或多个可能属于不同类型的值关联起来,放在一个对象中。
  • 原子类 通过对数据的包装,以实现在访问共享数据时不显式的进行加锁和同步,保证数据的并发访问和修改。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 泛型编程与模板的设计目标
  • 模板的底层原理
  • 模板的使用场景
    • 容器类
      • 包装类
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
      http://www.vxiaotou.com