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简介 …...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...
高效的后台管理系统——可进行二次开发
随着互联网技术的迅猛发展,企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心,成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统,它不仅支持跨平台应用,还能提供丰富…...
