【C++】学习笔记——模板进阶

文章目录

  • 十一、模板进阶
    • 1. 非类型模板参数
    • 2. 按需实例化
    • 3. 模板的特化
      • 类模板的特化
    • 4. 模板的分离编译
  • 未完待续


十一、模板进阶

1. 非类型模板参数

模板参数分为类型形参和非类型形参类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用

// 第一个形参为类型形参,第二个缺省形参为非类型形参
template<class T, size_t N = 10>
#include<iostream>
using namespace std;template<class T, size_t N>
class arr
{// N可以用来分配初始空间
};int main()
{arr<int, 10> a1;arr<int, 1000> a2;return 0;
}

在C++20之前,只支持整形做非类型模板参数

2. 按需实例化

类模板在实例化这个类的时候,会按需实例化(调用了哪个成员函数就实例化哪个函数) 。

#include<iostream>
using namespace std;template<class T, size_t N>
class arr
{
public:T& operator[](size_t index){// 该函数参数不匹配size(1);return _array[index];}const T& operator[](size_t index)const{return _array[index];}size_t size()const { return _size; }bool empty()const { return 0 == _size; }private:T _array[N];size_t _size;
};int main()
{// 不去调用 operator[] 时,检查不出来错误arr<int, 10> a1;arr<int, 1000> a2;return 0;
}

在这里插入图片描述
当调用出错的部分的函数时才能检查出错误:

int main()
{// 不去调用 operator[] 时,检查不出来错误arr<int, 10> a1;arr<int, 1000> a2;// 调用operator[]a1[1];return 0;
}

在这里插入图片描述

3. 模板的特化

通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果。比如说我们有这样一个函数模板:

template<class T>
bool less(T left, T right)
{return left < right;
}

该函数模板可以比较大小,但是假如有人错误的传入 地址 当实参,这里必然会出现不确定的结果。如果我们想要传地址也让其结果正确的话,我们就可以使用 模板的特化 。特化就是将模板特殊化,在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。即新增一个特化后的模板。

#include<iostream>
using namespace std;// 函数模板
template<class T>
bool Less(T left, T right)
{return left < right;
}// 特化后的模板
template<>
bool Less<int*>(int* left, int* right)
{return left < right;
}

此时,要是实例化的参数更符合特化就使用特化模板进行实例化,否则使用普通的函数模板进行实例化。

函数模板的特化步骤:

  1. 必须要先有一个基础的函数模板
  2. 关键字template后面接一对空的尖括号<>
  3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型
  4. 函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误。

一般情况下如果函数模板遇到不能处理或者处理有误的类型,为了实现简单通常都是将该函数直接给出,即直接实现一个特殊的函数构成重载。

bool Less(Date* left, Date* right)
{return *left < *right;
}

该种实现简单明了,代码的可读性高,容易书写,因此函数模板不建议特化。

类模板的特化

类模板特化也分为 全特化偏特化
全特化即是将模板参数列表中所有的参数都确定化。偏特化是任何针对模版参数进一步进行条件限制设计的特化版本

template<class T1, class T2>
class Data
{
public:Data(){cout << "Data<T1, T2>" << endl;}
private:T1 _d1;T2 _d2;
};// 全特化
template<>
class Data<int, char>   // 参数都全部给定
{
public:Data(){cout << "Data<int, char>" << endl;}
private:int _d1;char _d2;
};// 半特化/偏特化
template<class T>
class Data<T, char>     // 不是全特化的特化
{
public:Data(){cout << "Data<T, char>" << endl;}
private:int _d1;char _d2;
};

类模板的偏特化还可以这样使用:

//两个参数偏特化为指针类型 
template <class T1, class T2>
class Data<T1*, T2*>
{
public:Data(){cout << "Data<T1*, T2*>" << endl;}
private:T1 _d1;T2 _d2;
};

偏特化并不仅仅是指特化部分参数,而是针对模板参数更进一步的条件限制所设计出来的一个特化版本

4. 模板的分离编译

模板不建议声明和定义分离 。当声明和定义分离时,声明处有调用,所以知道模板实例化的类型,但是没有实现功能,定义处没有调用,可以实现功能但是不知道实例化的类型,所以定义处在编译时,并不会生成地址,导致链接时找不到地址从而产生链接错误。

在这里插入图片描述
解决方法有两种:①模板定义的位置显式实例化。(这种方法不实用,不推荐使用)②不进行声明和定义分离,将定义也放在.h头文件里


未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/10454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

掌握SEO优化的关键:提升网站排名的秘籍(如何提高网站seo排名)

你是否曾经在搜索引擎上搜索过一个关键词&#xff0c;然后点击了排在前几位的网站&#xff1f;如果是&#xff0c;那么你已经体会到了SEO&#xff08;搜索引擎优化&#xff09;的威力。SEO是一项关键的网络营销策略&#xff0c;它能够让你的网站在搜索引擎中获得更高的排名&…

Apache ECharts

Apache ECharts介绍&#xff1a; Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表。 官网地址&#xff1a;https://echarts.apache.org/zh/index.html Apache ECh…

Stable Diffusion写真完整教程

前言 最近自己对AI非常痴迷&#xff0c;并且今后也会一直在这个领域深耕&#xff0c;所以就想着先入门&#xff0c;因此花时间研究了一番&#xff0c;还好&#xff0c;出了点小成果&#xff0c;接下来给大家汇报一下。 AI绘画 提到AI绘画&#xff0c;大家可能立马会想到made…

A-loam建图算法

A-LOAM构建3d点云地图并实时转存二维栅格地图 A-loam算法。源代码用的是velodyne雷达话题&#xff0c;但是现在用rslidar来处理。所以也会遇到另外一个包来转换相关的数据。 git clone https://github.com/HKUST-Aerial-Robotics/A-LOAM.githttps://github.com/HViktorTsoi/r…

重庆市工程技术生态环境专业职称申报条件

重庆市工程技术生态环境专业职称申报条件链接重庆市人力资源和社会保障局 重庆市生态环境局关于印发重庆市工程技术生态环境专业职称申报条件的通知_重庆市人力资源和社会保障局类别基本条件业绩成果备注工程师具备博士学位&#xff1b;或具备硕士学位或第二学士学位&#xff0…

cin.ignore()函数和stoll函数

cin.ignore()函数 cin.ignore() 是一个非常实用的函数&#xff0c;主要用于控制输入流 cin 的行为 cin.ignore(int n 1, char delimiter EOF); n&#xff1a;一个整数参数&#xff0c;表示要忽略的字符数量。默认值是1&#xff0c;意味着只忽略下一个字符。delimiter&#x…

Android 屏幕适配全攻略(下)-百变屏幕无压力,这才是Android屏幕适配的终极解决方案

在上一篇文章中&#xff0c;我们介绍了Android屏幕适配的基本方法&#xff0c;比如使用限定符资源、图片适配、矢量图等。 感兴趣的朋友&#xff0c;请前往查阅&#xff1a;Android 屏幕适配全攻略&#xff08;中&#xff09;-从九宫格到矢量图&#xff0c;揭秘Android多屏幕适…

模拟集成电路(3)----单级放大器(共源极)

模拟集成电路(3)----单级放大器&#xff08;共源极&#xff09; 放大是模拟电路的基本功能 大多数自然模拟信号太小而无法处理需要足够的信噪比 理想的放大器 线性&#xff1a;无限的幅度和频率范围 输入阻抗无限大 输出阻抗无限小 共源放大器 共源放大器就是将源极接A…

01面向类的讲解

指针指向类成员使用 代码&#xff1a; #include<iostream> using namespace std;class Test { public:void func() { cout << "call Test::func" << endl; }static void static_func();int ma;static int mb; //不依赖对象 }; void Test::static…

JavaScript 动态网页实例 —— 事件处理应用

前言 事件处理的应用很广泛。在事件处理的应用中,鼠标事件的应用是最常用到的。本章给出几个鼠标事件处理应用的示例,包括:页面预览、图像切换、点亮文本、鼠标跟随、鼠标感应和禁用鼠标按键。在这些示例中,有的可以直接拿来应用,有的则只提供了一种应用的方法,稍加拓展,…

示例十一、声音传感器

通过以下几个示例来具体展开学习,了解声音传感器原理及特性&#xff0c;学习声音传感器的应用&#xff08;干货版&#xff09;&#xff1a; 示例十一、声音传感器 ino文件源码&#xff1a; //Arduino C demo void setup() {Serial.begin(9600);pinMode(5, OUTPUT); }void loo…

机器学习-无监督学习

无监督学习是机器学习和人工智能的另一个重要分支&#xff0c;它主要处理没有标签的数据集&#xff0c;目的是发现数据中的隐藏模式、结构或异常。无监督学习不依赖于预先定义的输出&#xff0c;而是让算法自己揭示数据的本质特征。 无监督学习的过程通常包括以下几个步骤&…

标准服务器控件

文本类型控件 通常指的是用于输入或显示文本的控件。 TextBox&#xff1a;这是最基本的文本输入控件。它允许用户在页面上输入文本。你可以设置它的属性来控制其行为&#xff0c;如MaxLength&#xff08;限制输入的最大字符数&#xff09;、ReadOnly&#xff08;是否只读&…

【C/C++笔试练习】DNS设置文件、应用层、Dos攻击、DNS服务、DNS、子网划分、http状态、路由设置、TCP连接、HTTP状态码、剪花布条、客似云来

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;DNS设置文件&#xff08;2&#xff09;应用层&#xff08;3&#xff09;Dos攻击&#xff08;4&#xff09;DNS服务&#xff08;5&#xff09;DNS&#xff08;6&#xff09;子网划分&#xff08;7&#xff09;http状态&am…

docker01-简介和概述

什么是docker&#xff1f; 我们现在开发项目是在windows操作系统使用idea开发&#xff0c;本地windows操作系统上有我们项目所需的jdk&#xff0c;mysql&#xff0c;redis&#xff0c;tomcat等环境&#xff0c;如果我们想打包我们的项目到一个别的服务器上&#xff0c;在别的服…

【Apache POI】Apache POI-操作Excel表格-简易版

Catalog Apache POI-操作Excel表格1. 需求2. 优点3. 缺点4. 应用场景5. 使用方法6. SpringBoot工程中处理Excel表格7. Demo示例 Apache POI-操作Excel表格 1. 需求 大多数项目的在运营过程中&#xff0c;会产生运营数据&#xff0c;如外卖系统中需要统计每日的订单完成数、每…

SpringBoot实现图片验证码

引入依赖 <dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId><version>1.6.2</version> </dependency>代码实现 package com.qiangesoft.captcha.controller;import com.wf.captcha.*…

最少数量线段覆盖-华为OD

系列文章目录 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、java代码五、测试用例 前言 本人最近再练习算法&#xff0c;所以会发布一些解题思路&#xff0c;希望大家多指教 一、题目描述 给定坐标轴上的一组线段&#xff0c;线段的起点和终点均为整数…

C++:类与对象—继承

类与对象—继承 一、继承是什么&#xff1f;二、继承定义三、基类和派生类对象赋值转换四、继承中的作用域五、派生类的默认成员函数六、继承与友元七、继承与静态成员八、复杂的菱形继承及菱形虚拟继承九、继承的总结和反思十、考察重点 一、继承是什么&#xff1f; 继承(inh…

知识付费系统需要哪些资质要求,教育机构教务工作计划内容有哪些?

每个培训教育机构都是由很多人员组成&#xff0c;作为教育机构&#xff0c;老师不必须&#xff0c;是必不可少的&#xff0c;但是除了老师之外还得配备一定数量的销售人员和教务工作者&#xff0c;教务老师其实也就是搞后勤的&#xff0c;但是是必须的&#xff0c;那么教育机构…