C++ 模板特化
非类型模板参数
定义:对于函数模板和类模板,模板参数并不局限于类型,普通值也可以作为模板参数
非类型模板参数定义的是常量
template<typename T, size_t N>
class array;
//T:类型模板参数
//N:非类型模板参数,一个常量
使用场景:
template<typename T, size_t N>
class Stack{
private:T _arr[N];int _top;
};int main(){Stack<int,100> st1;Stack<float,500> st2;return 0;
}
注意:
- 非类型模板参数是常量,不能修改
template<typename T, size_t N>
class Stack{
public:void f(){N=10; //不可修改非类型模板参数}
private:T _arr[N];int _top;
};int main(){Stack<int,100> st1;st1.f();return 0;
}
- 有些类型不能作为非类型模板参数,例如浮点数、类对象、字符串,非类型模板参数基本上都是整型,也只有整型是有意义和价值的【char 是整型】
- 非类型模板参数必须在编译期就能确认结果
array

#include<iostream>
#include<array>
#include<vector>
using namespace std;
int main() {vector<int> v1(100, 0);array<int, 100> a1;cout << "size of v1:" << sizeof(v1) << endl;cout << "size of a1:" << sizeof(a1) << endl;return 0;
}

vector 在堆上开辟空间,array 在栈上开辟空间
用 array 对标 vector 是错误的,与原生数组可以对比
array<int, 100> a1;
int a2[100];
array 的最大优势:有一个越界的检查,读和写都可以检查到是否越界
总结:array 相较于原生数组,有越界检查的优势,实际中建议直接使用 vector
模板特化
引入:给特殊类型准备特殊模板。使用模板可以实现一些与类型无关的代码,对于一些特殊类型,对其进行一些“特殊的处理”
定义:针对某些类型进行特殊化处理
函数模板的特化
步骤:
- 必须先有一个基础的函数模板
- 关键字 template 后面接一对空的 <>
- 函数名后跟一对尖括号,尖括号中指定需要特化的内容
- 函数形参表必须和模板函数的基础参数类型完全相同
PS:函数模板不一定非要特化,写一个匹配参数的普通函数更容易理解
#include<iostream>
#include "Date.h"
using namespace std;
//函数模板
template<typename T>
bool Less(T left, T right){return left < right;
}
//函数模板的特化处理
template<>
bool Less<Date*>(Date* left, Date* right){return *left < *right;
}
//直接匹配的普通函数
bool Less(Date* left, Date* right){return *left < right;
}
int main(){cout << Less(1, 2) << endl;Date d1(2022, 7, 7);Date d2(2022, 7, 8);cout << Less(d1, d2) << endl;Date* p1 = new Date(2022, 7, 16);Date* p2 = new Date(2022, 7, 15);cout << Less(p1, p2) << endl;//若存在直接匹配的普通函数(函数重载),会优先使用现成的函数重载,不用实例化return 0;
}
类模板的特化
类模板无法实现一个具体的实际类型,故必须特化
#include<iostream>
using namespace std;
template<typename T1, typename T2>
//类模板
class Data {
public:Data() {cout << "Data <T1, T2>" << endl;}
private:T1 _d1;T2 _d2;
};
//类模板的特化
template<>
class Data<int, double> {
public:Data() {cout << "Data <int, double>" << endl;}
};
int main(void) {Data<int, int> d1;Data<int, double> d2;return 0;
}
全特化
定义:将模板参数列表中所有的参数都确定化
#include<iostream>
using namespace std;
//类模板
template<typename T1, typename T2>
class Data {
public:Data() {cout << "Data <T1, T2>" << endl;}
private:T1 _d1;T2 _d2;
};
//全特化
template<>
class Data<int, double> {
public:Data() {cout << "Data <int, double>" << endl;}
};
int main(void) {Data<int, int> d1;Data<int, double> d2;return 0;
}
半特化 / 偏特化
定义:将部分参数类表中的一部分参数特化
#include<iostream>
using namespace std;
//类模板
template<typename T1, typename T2>
class Data {
public:Data() {cout << "Data <T1, T2>" << endl;}
private:T1 _d1;T2 _d2;
};
//半特化
template<typename T1>
class Data<T1, char> {
public:Data() {cout << "Data <T1, char>" << endl;}
};
//半特化的另一种表现形式,可以对参数进行进一步限制
//限制两个参数都是指针:只要两个参数都是指针,就匹配
template<typename T1, typename T2>
class Data<T1*, T2*> {
public:Data() {cout << "Data <T1*, T2*>" << endl;}
};
//限制两个参数都是引用:只要两个参数都是引用,就匹配
template<typename T1, typename T2>
class Data<T1&, T2&> {
public:Data() {cout << "Data <T1&, T2&>" << endl;}
};
int main(void) {Data<int, char> d3; // Data <T1, char>Data<char, char> d4; // Data <T1, char>Data<int*, char*> d5; // Data <T1*, T2*>Data<char*, string*> d6; // Data <T1*, T2*>Data<char**, void*> d7; // Data <T1*, T2*>Data<int, char*> d8; // Data <T1, T2>Data<int&, char&> d9; // Data <T1&, T2&>Data<char&, string&> d10; // Data <T1&, T2&>Data<int, char&> d11; // 编译错误return 0;
}
相关文章:
C++ 模板特化
非类型模板参数 定义:对于函数模板和类模板,模板参数并不局限于类型,普通值也可以作为模板参数 非类型模板参数定义的是常量 template<typename T, size_t N> class array; //T:类型模板参数 //N:非类型模板参…...
Spring-createBean部分源码
createBean源码: /*** Central method of this class: creates a bean instance,* populates the bean instance, applies post-processors, etc.* see #doCreateBean*/ Override protected Object createBean(String beanName, RootBeanDefinition mbd, Nullable …...
2015年亚太杯APMCM数学建模大赛C题识别网络中的错误连接求解全过程文档及程序
2015年亚太杯APMCM数学建模大赛 C题 识别网络中的错误连接 原题再现 网络是描述真实系统结构的强大工具——社交网络描述人与人之间的关系,万维网描述网页之间的超链接关系。随着现代技术的发展,我们积累了越来越多的网络数据,但这些数据部…...
js:可选链运算符(?.)和空值合并运算符(??)
文档: 可选链运算符(?.)https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Optional_chaining空值合并运算符(??)https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Referenc…...
【Java 进阶篇】Java ServletContext功能:获取文件服务器路径
Java ServletContext是Java EE中的一个核心接口,用于与Servlet容器进行通信,提供了许多有用的功能,包括获取文件服务器路径。在本文中,我们将详细介绍如何使用ServletContext来获取文件服务器路径,并提供示例代码以帮助…...
Android startActivity流程
1.常规调用 startActivity(new Intent(this,MainActivity.class)); 进入Activity的startActivity方法 /*** Same as {link #startActivity(Intent, Bundle)} with no options* specified.** param intent The intent to start.** throws android.content.ActivityNotFoundExc…...
Qt实验室
前言 本系列文章是研究和记录Qt开发过程中遇到的各种问题的集合 由于Qt是一个庞大的开发体系,很难用有限的文案对其做全面深入细致的讲解,因此市面上大多数Qt开发相关的教程都显得极其粗浅入门,通常只能作为最基本的入门教程。但是实际项目…...
diffusers-Load adapters
https://huggingface.co/docs/diffusers/main/en/using-diffusers/loading_adaptershttps://huggingface.co/docs/diffusers/main/en/using-diffusers/loading_adapters 有几种训练技术可以个性化扩散模型,生成特定主题的图像或某些风格的图像。每种训练方法都会产…...
CVI 串口调试助手
基于Labwindows CVI 2017编写的一个简单的串口调试助手,附带接收一个00–99的两位数并进行波形绘制的功能,编写过程可见:https://blog.csdn.net/Stark_/article/details/129003839 #include <ansi_c.h> #include <rs232.h> #incl…...
【蓝桥杯选拔赛真题48】python最小矩阵 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析
目录 python最小矩阵 一、题目要求 1、编程实现 2、输入输出 二、算法分析...
如何在家庭网络中开启 IPv6内网穿透
随着互联网的不断发展,IPv4地址资源逐渐枯竭,而IPv6作为它的继任者,为网络连接提供了更多的IP地址。启用IPv6对于家庭网络来说变得越来越重要,因为它可以提供更稳定、更安全、更快速的互联网连接。本文将指导如何在家庭网络中启用…...
CodeWhisperer 的安装及体验
CodeWhisperer 是亚马逊出品的一款基于机器学习的通用代码生成器,可实时提供代码建议。类似 Cursor 和 Github Copilot 编码工具。 官网:aws.amazon.com/cn/codewhis… 在编写代码时,它会自动根据您现有的代码和注释生成建议。从单行代码建…...
【C/C++】虚析构和纯虚析构
纯虚析构的问题 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码。 解决方式:将父类中的析构函数改为虚析构或者纯虚析构 虚析构和纯虚析构共性: 可以解决父类指针释放子类对象都需要有…...
第四章 应用SysML基本特性集的汽车示例 P1|系统建模语言SysML实用指南学习
仅供个人学习记录 汽车模型 主要就是应用练习建模了 Automobile Domain包 用于组织模型的包图 将模型组织入包的包图 需求图捕获汽车规范 汽车规范中包含系统需求的需求图 块定义图定义车辆及其外部环境 汽车域块定义图 用例图表示操作车辆 描述车辆主要功能的用…...
C语言 写一个简易音乐播放器
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <math.h>#define SAMPLE_RATE 44100 // 采样率 #define AMPLITUDE 32767 // 振幅 #define NO_SAMPLES 44100 // 样本数// 声明一个结构体用于表示音符 typedef struct {double …...
面试题:有一个 List 对象集合,如何优雅地返回给前端?
文章目录 1.业务背景每个对象里面都带上了重复的一个sessionId数据,我想提出来该怎么办? 2.实体类3.自定义Mapper和xml文件4.Service层5.Controller层 1.业务背景 业务场景中,一个会话中存在多个场景,即一个session_id对应多个sc…...
DAY43 完全背包理论基础 + 518.零钱兑换II
完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同…...
unity 从UI上拖出3D物体,(2D转3D)
效果展示: 2D转3D视频 UI结构 UI组件挂载 UI结构 这个脚本挂载到 3D物体身上 using DG.Tweening; using System.Collections; using System.Collections.Generic; using UnityEngine;public class DragGame : MonoBehaviour {[HideInInspector]public bool isDrag…...
win10pycharm和anaconda安装和环境配置教程
windows10 64位操作系统下系统运行环境安装配置说明 下载和安装Anaconda,链接https://www.anaconda.com/download 下载完后,双击exe文件 将anaconda自动弹出的窗口全部关掉即可,然后配置高级系统变量 根据自己的路径,配置…...
[C++ 中]:6.类和对象下(static成员 + explicit +友元函数 + 内部类 + 编译器优化)
(static成员 explicit 友元函数 内部类 编译器优化) 一.static 成员:1.概念引入:1-1:定义全局变量记录个数? 2.如果有多个类需要分开去记录类对象的个数?2-1:可不可以声明成员变量解决&#…...
从CLPM到RI-CLPM:Mplus中交叉滞后模型的进阶指南与选择策略
从CLPM到RI-CLPM:纵向数据分析的模型选择与实战解析 在心理学和行为科学的纵向研究中,交叉滞后模型(CLPM)长期以来是分析变量间相互影响关系的标准工具。然而,随着研究方法论的进步,研究者们逐渐认识到传统…...
大多数加密API都不够用:量化团队真正需要的数据到底是什么?
如果你做过加密相关开发,无论是: 量化交易数据平台研究分析风控系统 你大概率都会经历一个阶段: 👉 API 接了一堆,但始终“不够用”。 常见的一个误区 很多人在刚开始做数据接入时,会觉得: …...
从零开始:用正则表达式处理日期时间格式的完整指南
从零开始:用正则表达式处理日期时间格式的完整指南 在数据处理和文本分析中,日期时间格式的校验一直是个高频需求。无论是表单验证、日志分析还是数据清洗,确保日期时间格式的正确性都至关重要。正则表达式作为文本处理的瑞士军刀,…...
C++ 智能指针的底层实现逻辑
C智能指针的底层实现逻辑揭秘 在C开发中,内存管理一直是程序员需要谨慎处理的难题。传统裸指针容易导致内存泄漏、悬垂指针等问题,而智能指针通过自动化资源管理,显著提升了代码的安全性和可维护性。那么,智能指针是如何在底层实…...
用TurtleBot3实测:Navigation2局部代价地图的滚动窗口为何必须用odom坐标系?
TurtleBot3实测:为什么Navigation2局部代价地图必须绑定odom坐标系? 当你在Gazebo中第一次看到TurtleBot3的导航表现时,可能会对局部代价地图(Local Costmap)的坐标系选择产生疑问。为什么这个实时更新的避障地图要绑定…...
FPGA实战:8点FFT运算的Verilog实现与误差优化技巧
FPGA实战:8点FFT运算的Verilog实现与误差优化技巧 在数字信号处理领域,快速傅里叶变换(FFT)算法是频谱分析的核心工具。对于FPGA开发者而言,掌握FFT的硬件实现不仅能提升系统性能,更能深入理解算法与硬件的…...
viem ABI工具使用教程:编码、解码和类型推断全攻略
viem ABI工具使用教程:编码、解码和类型推断全攻略 【免费下载链接】viem TypeScript Interface for Ethereum 项目地址: https://gitcode.com/gh_mirrors/vi/viem viem是一个轻量级、可组合且类型安全的TypeScript以太坊接口工具库,其强大的ABI工…...
清音刻墨镜像免配置亮点:内置10+中文领域词典(医疗/法律/IT)开箱即用
清音刻墨镜像免配置亮点:内置10中文领域词典(医疗/法律/IT)开箱即用 1. 为什么字幕对齐需要专业词典? 做视频字幕的朋友都知道,最头疼的不是生成文字,而是让文字和声音完美对齐。普通字幕工具遇到专业术语…...
NTP配置避坑指南:华三/华为/思科设备时间同步差异对比
NTP配置避坑指南:华三/华为/思科设备时间同步差异对比 在网络运维中,时间同步是确保日志分析、安全审计和故障排查准确性的基础。不同厂商的设备在NTP配置上存在细微但关键的差异,这些差异往往成为混合环境部署中的"暗坑"。本文将深…...
保姆级教程:在YOLOv12中集成CBAM注意力模块(附完整代码与配置文件)
从零实现YOLOv12与CBAM注意力模块的深度整合实战指南 在目标检测领域,YOLO系列算法始终保持着前沿地位。最新发布的YOLOv12在速度和精度之间取得了更好的平衡,而注意力机制的引入则能进一步提升模型对关键特征的捕捉能力。本教程将手把手带你完成CBAM注…...
