【Example】C++ 模板概念讲解及编译避坑

C++ 不同于 Java,它没有标准的 Object 类型。也就意味着 C++ 并不存在完整的泛型编程概念。

为什么不存在完整的泛型编程概念,放到最后一个例子讲,先讲 “部分的” 泛型编程概念的实现方式: 模板

什么是模板?

模板是 c + + 中的泛型编程的基础。 作为强类型语言,c + + 要求所有变量都具有特定类型,由程序员显式声明或由编译器推断。

但是,许多数据结构和算法的外观都是相同的,无论它们的操作类型是什么。

利用模板,您可以定义类或函数的操作,并允许用户指定这些操作应使用的具体类型。

总结:模板是 C++ 当中支持参数类型与返回值动态化的工具,使开发人员可以动态自定义函数、类中参数与返回值类型。

模板又分为两种:函数模板 与 类模板。

====================================

1,函数模板

先从最简单的定义讲起:

可以看到,以上函数实现了最简单的任意同类型变量相加的一个功能。

定义模板的关键字就是 template,语法:

template<> 对函数声明或定义进行修饰,其中 T 可以是任意名字(例如Object)。

进行在模板函数调用时,编译器会根据变量类型推断函数参数类型。

那么,函数模板是否可以支持多种类型呢?可以!

以上函数最简单实现了求两个不同类型变量的乘积。当你的参数类型需要两种或以上的时候,就是在 template<> 当中增加声明,再对函数或类进行修饰:

那么,除了基本的数据类型,模板是否支持结构体(struct)或其他类型呢?可以!但是,进行运算操作的时候,你要确保你的 struct 或 class 重载的相应的运算符!

可以看到,以上代码当中我定义了两个不同的结构体,只是单纯的去比较这两个结构体的大小。

====================================

2,类模板

函数模板很好理解,那么类模板是什么呢?

可以在类模板的内部或外部定义成员函数。 如果在类模板的外部定义成员函数,则会像定义函数模板一样定义它们。 –Microsoft Docs

以下演示了一个最简单的使用模板的类:

这个类仅仅是简单将 std::vector 包装了一下而已。

于是我们可以总结出语法:

1,使用 template<> 对类声明和类定义进行修饰。

2,类内部需要使用模板类型时,直接使用相应的模板形参名。

请注意,就像任何模板类成员函数一样,类的构造函数成员函数的定义包含模板参数列表两次。

成员函数可以是函数模板,并指定附加参数。 –Microsoft Docs

当模板类需要被使用的时候,如何进行声明并创建呢?

以上演示了局部变量及智能指针的创建。然后,像平常那样调用即可:

好了,上面是最基本的类模板。

这是一个什么东西呢?

1,它是一个常量。

2,它的类型只能是 int 、指针、引用这三种内置类型。

它的使用场景?

1,你封装了一个可以容纳固定大小的容器。

2,可以预初始化固定资源。

样例:

以上代码,同样是将 std::vector 简单无意义包装了一下,但是,却使用了非类型形参进行了内存预分配操作以提高性能。

所以模板非类型形参的语法是:

即不使用 class 或者 typename,直接使用 INT or PTR or REF。

那么该如何使用呢?

可以看到,使用它的语法就是:

====================================

3,模板与完整泛型编程的区别(编译避坑)

C++ 的模板类在没有被使用之前,编译器完全不知道它会占用多少空间!而 C++ 每一个变量及对象占用的空间在编译的时候就要被确定!所以 C++ 当中没有绝对的泛型编程概念。

所以,模板类必须是声明与实现同源(不一定是文件不分离),最合适的写法也就是 hpp 文件。

简单化使用.h头文件和.cpp文件分类声明时,几乎确定会报链接错误。

解决方法可以简单粗暴的将 cpp 文件 include 到 h 文件当中,但这并非标准做法,MSC编译器也已经不支持,所以最合适的做法还是使用 hpp 文件。

Original: https://www.cnblogs.com/airchip/p/15941405.html
Author: 芯片烤电池
Title: 【Example】C++ 模板概念讲解及编译避坑

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/606308/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 招人、找人、找大牛啦!

    招人、找人、找大牛啦! 有意从事、投资TO B业务,含新型操作系统、大数据、人工智能、高性能计算、分布式应用软件的研发、高管、合伙人朋友请联系我,我司正在启动新一轮业务拓展!详情私…

    Linux 2023年6月6日
    088
  • Linux解压命令

    .tar解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)———————————————….

    Linux 2023年6月13日
    067
  • [20220104]in list 几种写法性能测试.txt

    [20220104]in list 几种写法性能测试.txt –//以前写过几种in list的写法,从来没有测试过这几种方法的性能测试看看. 1.环境:SCOTT@b…

    Linux 2023年6月13日
    055
  • Linux下如何切割与合并大文件

    我们传输一个大文件时,有时网络比较慢,需要花费很长时间才能传输完成,或者传输的过程中,网络不稳定,有可能导致此次传输失败,针对这种情况,我们可以把大文件切分成小文件,再逐个的传输到…

    Linux 2023年6月13日
    0115
  • Cause: java.lang.ClassNotFoundException: Cannot find class: Studen

    Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type…

    Linux 2023年6月7日
    098
  • [20211217]滑稽可笑的程序代码2.txt

    [20211217]滑稽可笑的程序代码2.txt –//实在不知道如何取标题..感觉很无奈无语… –//昨天上午快下班的时候我使用ashtop看…

    Linux 2023年6月13日
    071
  • Django orm的managed参数

    Django orm的managed参数 如果一张表不是在django的models.py中创建表,而是该表由cmd或者Navicat或者其他方式创建的,或者该表是一个视图,那么也…

    Linux 2023年6月14日
    081
  • IOC容器模拟实现

    运用反射机制和自定义注解模拟实现IOC容器,使其具有自动加载、自动装配和根据全限定类名获取Bean的功能。 1-1 IOC容器的本质 IOC容器可理解为是一个map,其中的一个en…

    Linux 2023年6月8日
    084
  • git-config 配置多用户环境以及 includeIf用法

    方法一: 直接在 $path文件中添加 &#x7528;&#x6237;&#x540D;和 &#x90AE;&#x7BB1;,如: [use…

    Linux 2023年5月27日
    0125
  • 剑指offer计划28(搜索与回溯算法困难)—java

    1.1、题目1 剑指 Offer 37. 序列化二叉树 1.2、解法 这题给我笑死了,我看到题解有个解法,我愿称之为神。 public class Codec { private …

    Linux 2023年6月11日
    096
  • 在Linux下配置RealVNC和TigerVNC

    作者:alittlemc | 更新中 | 原创文章,可能有技术理解错误,欢迎指正,请与我联系,谢谢! 命令和快速总结 realvnc创建# :会话id -name 取名字 -dep…

    Linux 2023年6月6日
    0107
  • cmake 入门笔记

    1. cmake 是什么? 这些年大型 C/C++ 工程都纷纷转到了 cmake 环境下,那么这个工具到底有什么魅力吸引着大家呢?无它,软件工程崇尚实用主义,而 cmake 的功能…

    Linux 2023年6月6日
    098
  • Docker(47)- 一键安装 docker 的 shell 脚本

    背景 有多个自己的云服务器,都要安装 docker,所以就尝试将安装的步骤转换成 shell 脚本,回头可以一键执行~ 创建 shell 脚本 touch install_dock…

    Linux 2023年5月28日
    077
  • k8s/kubeadm 生产环境高可用集群部署

    kubeadm 生产环境集群部署 基本环境配置 kubeadm 安装方式自 1.14 版本以后,安装方法几乎没有任何变化,此文档可以尝试安装最新的 k8s 集群, centos 采…

    Linux 2023年6月14日
    092
  • Kafka部署安装及简单使用

    一、环境准备 1、jdk 8+ 2、zookeeper 3、kafka 说明:在kafka较新版本中已经集成了zookeeper,所以不用单独安装zookeeper,只需要在kaf…

    Linux 2023年6月13日
    0106
  • 2021 — 冰与火之歌

    大半夜的睡不着,越发的想给 2021 年作个总结,一想更睡不着了,来唠叨下吧。 一拖再拖的婚礼。本来定在今年正月的婚礼,因为疫情,不敢办,村里也不让办;然后选在国庆吧,卧槽,封城了…

    Linux 2023年6月16日
    0113
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球