C++笔记 模板的进阶知识
目录
1. 非类型模板参数
2.模板的特化
2.1 函数模板的特化
2.2 类模板的特化
2.2.1 全特化
2.2.2 偏特化
3.模板的分离编译
3.1 什么是分离编译?
3.2 模板的分离编译
4.模板的总结
模板的初阶内容:(594条消息) C++模板的原理和使用_全貌的博客-CSDN博客_c++模板实现原理
https://blog.csdn.net/qq_64105689/article/details/126693075?spm=1001.2014.3001.5501
1. 非类型模板参数
模板的参数分为 类类型形参和非类型形参
类类型形参:出现在模板参数列表中,由class 和 typename关键字修饰
非类型形参:用一个常量来做类(函数)模板的参数,在类(函数)中可将该参数当作常量使用
namespace test
{//实现一个包含非类型模板参数的静态数组template<class T, size_t N = 10>//在类中,可以将N当作常量使用class array{public:T& operator[](size_t i){return _arr[i];}const T& operator[](size_t i){return _arr[i];}bool empty(){//...}private:K _arr[N];size_t size;};
}
字符串、浮点数、类对象是不允许作为非类型模板参数
非类型模板参数必须在编译时就确定结果
2.模板的特化
使用模板可以编写一些与类型无关的代码,但在面对特殊类型结果就会错误
比如实现了一个比较函数Less,大部分情况下比较的结果都是正确的,但是对指针类型,比较的是指针存放地址的大小,结果显然易见是错误的,这时候模板的特化很好的解决了这样的问题
template<class T>
bool Less(const T& a, const T& b)
{return a < b;
}
int main()
{int a1 = 7;int a2 = 6;cout << Less(a1, a2) << endl;//比较的是a1和a2的值//结果正确int* ptr1 = &a1;int* ptr2 = &a2;cout << Less(ptr1, ptr2) << endl;//比较的是a1和a2的地址//应返回false,打印0,结果错误return 0;
}
2.1 函数模板的特化
1.必须先有一个函数模板
template<class T>//要特化的函数模板 void Func(T& left, T& right) { };2.template后面跟空的<>
template<>//跟一对空的<> void Func<int*>(int* val1,int* val2) {}3.函数名后跟一对尖括号,括号内是要特化的类型
template<>//跟一对空的<> void Func<int*>(int* val1,int* val2)//函数名Func后跟要特化的类型 {}4.形参列表必须跟模板参数完全相同,不然就会出现一些奇怪的错误
template<>//跟一对空的<> void Func<int*>(int* val1,int* val2)//函数名Func后跟要特化的类型 {//新参列表的类型要与特化的类型int*一致 }
当然函数模板是不建议使用特化的,因为遇到一些复杂的类型函数模板不好处理时,可以直接显示写出该函数。
bool Func(int* left,int* right) {return *left < *right; }
2.2 类模板的特化
2.2.1 全特化
顾名思义,就是将函数模板参数全部确定化
template<class T1, class T2>
class Func
{
public: Func(){cout << "Func() T1,T2" << endl;}
private:T1 _a1;T2 _a2;
};template<>
class Func<char, int>
{
public: Func(){cout << "Func char, int" << endl;}
private:char _a1;int _a2;
};int main()
{Func<int,int> f1;Func<char,int> f2;return 0;
}

2.2.2 偏特化
针对任意模板参数进行特殊处理
偏特化分为两种:
1.部分特化
就是特化模板参数的部分,其他跟全特化一致
2.对参数更进一步的限制
比如模板参数为T1,T2,那么可以特化为<T1*, T2*>、<T1&,T2&>的版本
template<class T1, class T2> class Func { public: Func(){cout << "Func() T1,T2" << endl;} private:T1 _a1;T2 _a2; }; template<> class Func<T1*, T2*> { public: Func(){cout << "Func() T1*,T2*" << endl;} private:T1* _a1;T2* _a2; }; template<> class Func<T1&, T2&> { public: Func(){cout << "Func() T1&,T2&" << endl;} private:T1& _a1;T2& _a2; };
3.模板的分离编译
3.1 什么是分离编译?
一个程序(项目) 由若干个源文件共同实现,通过编译形成目标文件,最后将目标文件链接形成单一的可执行文件,执行的过程就叫做分离编译。
3.2 模板的分离编译
举个例子:
//a.h
template<class T>
T& Add(const T& letf, const T& right);//a.cpp
template<class T>
T& Add(const T& letf, const T& right);
{return left + right;
}//test.cpp
#include"a.h"
int main()
{Add(1,2);
}
C/C++程序要运行,要经过 预处理 -> 编译 -> 汇编 -> 链接
编译:对程序按照语言特性进行词法、语法、语义分析,错误检查无误后生成汇编代码
头文件不参加编译,编译器对程序内多个源文件是单独分开独立编译的。
链接,将多个.obj文件链接到一起,并处理没有解决的地址问题
解决方法:将.h跟.cpp文件放入一个文件xxx.hpp或xxx.h里面
4.模板的总结
优点:
1.模板复用了代码,增加了开发效率,C++的模板库(STL)也因此而诞生
2.增强了代码的灵活性
缺点:
1.模板会导致代码膨胀的问题,编译时间变长
2.模板编译错误时,错误信息非常凌乱,不易定位错误
相关文章:
C++笔记 模板的进阶知识
目录 1. 非类型模板参数 2.模板的特化 2.1 函数模板的特化 2.2 类模板的特化 2.2.1 全特化 2.2.2 偏特化 3.模板的分离编译 3.1 什么是分离编译? 3.2 模板的分离编译 4.模板的总结 模板的初阶内容:(594条消息) C模板的原理和使用_全貌的博客-CSD…...
基于 Debain11 构建 asp.net core 6.x 的基础运行时镜像
基于 Debain11 构建 asp.net core 6.x 的基础运行时镜像Linux 环境说明Debian 简介Debian 发行版本关于 Debian 11Linux 常用基础工具Dockerfile 中 RUN 指令RUN 语法格式RUN 语义说明编写 Dockerfile 构建 Runtime 基础镜像ASP.NET Core Runtime 基础镜像Dockerfile 编写Windo…...
【无人机路径规划】基于IRM和RRTstar进行无人机路径规划(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Spring Boot中使用@Autowire装配接口是怎么回事?
在学习使用Spring Boot框架时候,发现了一个特别的现象UserMapper是一个接口,在另一个类中好像直接使用Autowired装配了一个UserMapper对象???我纳闷了一会儿,接口居然可以直接实例对象吗?根据我…...
23种设计模式介绍(Python示例讲解)
文章目录一、概述二、设计模式七种原则三、设计模式示例讲解1)创建型模式1、工厂模式(Factory Method)【1】简单工厂模式(不属于GOF设计模式之一)【2】工厂方法模式2、抽象工厂模式(AbstractFactory&#x…...
初识Hadoop,走进大数据世界
文章目录数据!数据!遇到的问题Hadoop的出现相较于其他系统的优势关系型数据库网格计算本文章属于Hadoop系列文章,分享Hadoop相关知识。后续文章中会继续分享Hadoop的组件、MapReduce、HDFS、Hbase、Flume、Pig、Spark、Hadoop集群管理系统以及…...
加油站会员管理小程序实战开发教程14 会员充值
我们上篇介绍了会员开卡的业务,开卡是为了创建会员卡的信息。有了会员卡信息后我们就可以给会员进行充值。当然了充值这个业务是由会员自主发起的。 按照我们的产品原型,我们在我的页面以轮播图的形式循环展示当前会员的所有卡信息。这个会员卡信息需要先用变量从数据源读取…...
leetcode 1792. 最大平均通过率
一所学校里有一些班级,每个班级里有一些学生,现在每个班都会进行一场期末考试。给你一个二维数组 classes ,其中 classes[i] [passi, totali] ,表示你提前知道了第 i 个班级总共有 totali 个学生,其中只有 passi 个学…...
15-基础加强-2-xml(约束)枚举注解
文章目录1.xml1.1概述【理解】(不用看)1.2标签的规则【应用】1.3语法规则【应用】1.4xml解析【应用】1.5DTD约束【理解】1.5.1 引入DTD约束的三种方法1.5.2 DTD语法(会阅读,然后根据约束来写)1.6 schema约束【理解】1.6.1 编写schema约束1.6.…...
13:高级篇 - CTK 事件管理机制(signal/slot)
作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在《12:高级篇 - CTK 事件管理机制(sendEvent/postEvent)》一文中,我们介绍了如何进行插件间通信 - sendEvent()/postEvent() + ctkEventHandler。然而,除了这种方式之外,EventAdmin 还提供了另一种方…...
群晖-第1章-IPV6的DDNS
群晖-第1章-IPV6的DDNS 方案:腾讯云群晖DS920 本文参考群晖ipv6 DDNS-go教程-牧野狂歌,感谢原作者的分享。 这篇文章只记录了我需要的部分,其他的可以查看原文,原文还记录了更多的内容,可能帮到你。 一、购买域名 …...
centos7系统-kubeadm安装k8s集群(v1.26版本)亲测有效,解决各种坑可供参考
文章目录硬件要求可省略的步骤配置虚拟机ip设置阿里镜像源各服务器初始化配置配置主节点的主机名称配置从节点的主机名称配置各节点的Host文件关闭各节点的防火墙关闭selinux永久禁用各节点的交换分区同步各节点的时间将桥接的IPv4流量传递到iptables的链(三台都执行…...
帮助指令 man ,help及文档常用管理指令
帮助指令 man,help 1. man 当我们想要了解某个命令如何使用,及选项的含义是什么以及配置文件的帮助信息时,可以使用 man [命令或配置文件],这样便可以获得到帮助提示信息了。 语法格式:man [命令或者配置文件] 比如…...
电子科技大学操作系统期末复习笔记(五):文件管理
目录 前言 文件管理:基础 基本概念 文件 文件系统 文件系统的实现模型 文件的组成 文件名 文件分类 文件结构 逻辑结构 物理结构 练习题 文件管理:目录 文件控制块FCB FCB:File Control Block FCB信息 目录 基本概念 目…...
SpringBoot+ActiveMQ-发布订阅模式(生产端)
SpringBootActiveMQ-发布订阅模式(生产端)Topic 主题* 消息消费者(订阅方式)消费该消息* 消费生产者将发布到topic中,同时有多个消息消费者(订阅)消费该消息* 这种方式和点对点方式不同…...
Android实例仿真之三
目录 四 Android架构探究 五 大骨架仿真 六 Android实例分析思路拓展 四 Android架构探究 首先,Android系统所带来的好处,就在于它本身代码的开放性,这提供了一个学习、借鉴的平台。这对分析仿真而言,本身就是一大利好…...
关于MySQL的limit优化
1、前提 提示:只适用于InnoDB引擎 2、InnoDB存储特点 它把索引和数据放在了一个文件中,就是聚集索引。这与MyISAM引擎是不一样的。 3、SQL示例 -- 给cve字段建立索引 select * from cnnvd where cveCVE-2022-24808 limit 300000,10;由于M…...
Java-Stream流基本使用
collection.stream将会破坏原有的数据结构,可以通过collect方法收集,可以用Collectors提供的构造器,add等方法构造形成新的数据结构。 HashSet<List<Integer>> rs new HashSet<>(); rs.stream().toList();Collection集合转…...
Liunx(狂神课堂笔记)
一.常用命令 1. cd 切换目录 cd ./* 当前目录cd /* 绝对路径cd .. 返回上一级目录cd ~ 回到当前目录pwd …...
【史上最全面esp32教程】点灯大师篇
文章目录前言ESP32简介认识arduino的两个函数点灯步骤函数介绍LED灯闪烁流水灯总结前言 esp32有很多的功能,例如wifi,蓝牙等,这节我们学习最简单的点灯。 提示:以下是本篇文章正文内容,下面案例可供参考 ESP32简介 …...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
