当前位置: 首页 > news >正文

C++类模板的特化(三)

本文主要介绍类模板的特化、局部特化和缺省模板实参;

1.类模板的特化

类模板的特化(Class Template Specialization)是指为特定的模板参数提供自定义实现的过程。通过特化,我们可以针对某些特定的类型或条件提供不同的行为或实现;

如果需要特化一个类模板,需要特化该模板中的所有成员函数;

模板的特化注意事项:
需要将模板写成template <>,并且需要指明特定的类型,下面示例需要特化std::string的类型,成员函数按照正常的函数实现即可

template <>
class Stack <std::string>
{}

示例

/** @brief: class complates* @complie: g++ -g *.cc -o d -std=c++11* @autor: your name* @date: 2023/08/22*/#include <iostream>
#include <vector>
#include <stdexcept>template <class T>
class Stack 
{
private:std::vector<T> elems;public:void push(T const&);void pop();T top() const;bool empty() const{return elems.empty();}    int32_t getElemsSize() const{std::cout<<"not string size"<<std::endl;return elems.size();}
};template <typename T>
void Stack<T>::push(T const& elem)
{elems.push_back(elem);
}template <typename T>
void Stack<T>::pop()
{if(elems.empty()) {throw std::out_of_range("empty stack");}elems.pop_back();
}template <typename T>
T Stack<T>::top() const
{if(elems.empty()) {throw std::out_of_range("empty stack");}return elems.back();
}//std::string
template <>
class Stack <std::string>
{
private:std::vector<std::string> elems;public:void push(std::string const&);void pop();std::string top() const;bool empty() const{return elems.empty();}    int32_t getElemsSize() const{std::cout<<"string size"<<std::endl;return elems.size();}
};void Stack<std::string>::push(std::string const& elem)
{elems.push_back(elem);
}void Stack<std::string>::pop()
{if(elems.empty()) {throw std::out_of_range("empty stack");}elems.pop_back();
}std::string Stack<std::string>::top() const
{if(elems.empty()) {throw std::out_of_range("empty stack");}return elems.back();
}int main(int argc, char* argv[])
{Stack<int> int_stack;int_stack.push(10);int_stack.push(20);int_stack.push(30);std::cout<<int_stack.getElemsSize()<<std::endl;//std::stringStack<std::string> string_stack;string_stack.push("class");string_stack.push("int");string_stack.push("int64");string_stack.push("double");string_stack.push("float");std::cout<<string_stack.getElemsSize()<<std::endl;return 0;
}

2. 类模板的局部特化

类模板的局部特化(Partial Class Template Specialization)是指针对模板参数的部分特化,只针对某些特定的条件进行自定义实现的过程。通过局部特化,我们可以为满足特定条件的模板参数提供不同的实现。

示例

/** @brief: class complates* @complie: g++ -g *.cc -o d -std=c++11* @autor: your name* @date: 2023/08/22*/#include <iostream>
#include <vector>
#include <stdexcept>
#include <string>//局部特化
template <typename T, typename U>
class MyClass
{
public:void print() const{std::cout<<"typename and typename"<<std::endl;}
};template <typename T>
class MyClass<T, std::string>
{
public:void print() const{std::cout<<"typename and string"<<std::endl;}
};template <typename T>
class MyClass<T, double>
{
public:void print() const{std::cout<<"typename and double"<<std::endl;}
};int main(int argc, char* argv[])
{MyClass<int, int> int_myclass;int_myclass.print();MyClass<int, std::string> string_myclass;string_myclass.print();MyClass<int, double> double_myclass;double_myclass.print();return 0;
}

输出

typename and typename
typename and string
typename and double

3. 缺省模版实参

在函数模板的时候,可以将模板的参数定位为缺省值;即支持默认,也支持指定,使用起来更加的方便;

示例

/** @brief: class complates* @complie: g++ -g *.cc -o d -std=c++11* @autor: your name* @date: 2023/08/22*/#include <iostream>
#include <vector>
#include <deque>
#include <stdexcept>
#include <string>//缺省模版参数
template <typename T, typename CONT = std::vector<T>>
class Stack 
{
private:CONT elems;public:void push(T const&);void pop();T top() const;bool empty() const{return elems.empty();}    int32_t getElemsSize() const{        return elems.size();}
};template <typename T, typename CONT>
void Stack<T, CONT>::push(T const& elem)
{elems.push_back(elem);
}template <typename T, typename CONT>
void Stack<T, CONT>::pop()
{if(elems.empty()) {throw std::out_of_range("empty stack");}elems.pop_back();
}template <typename T, typename CONT>
T Stack<T, CONT>::top() const
{if(elems.empty()) {throw std::out_of_range("empty stack");}return elems.back();
}int main(int argc, char* argv[])
{//使用默认值Stack<int> int_stack;int_stack.push(10);int_stack.push(20);int_stack.push(30);std::cout<<int_stack.top()<<std::endl;//赋值类型Stack<double, std::deque<double>> double_stack;double_stack.push(10.11);double_stack.push(20.22);double_stack.push(30.33);std::cout<<double_stack.top()<<std::endl;return 0;
}

输出

30
30.33

相关文章:

C++类模板的特化(三)

本文主要介绍类模板的特化、局部特化和缺省模板实参&#xff1b; 1.类模板的特化 类模板的特化&#xff08;Class Template Specialization&#xff09;是指为特定的模板参数提供自定义实现的过程。通过特化&#xff0c;我们可以针对某些特定的类型或条件提供不同的行为或实现…...

基于YOLOV8模型的课堂场景下人脸目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOV8模型的课堂场景下人脸目标检测系统可用于日常生活中检测与定位课堂场景下人脸&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检…...

java八股文面试[数据结构]——Map有哪些子类

知识来源&#xff1a; 【23版面试突击】 用过哪些Map类&#xff0c;都有什么区别&#xff0c;HashMap是线程安全的吗&#xff1f;_哔哩哔哩_bilibili https://www.cnblogs.com/bubbleboom/p/12694013.html...

司徒理财:8.23今日黄金原油走势分析附操作策略

黄金走势分析&#xff1a;      黄金下跌遇阻&#xff0c;短线开启震荡调整走势&#xff0c;但跌势依旧没有改变&#xff0c;没有突破1906压力前&#xff0c;还是偏空走势&#xff0c;反弹继续干空。趋势行情&#xff0c;不要轻言翻转&#xff01;即便下跌结束&#xff0c;…...

使用动态IP是否会影响网络

今天我们要谈论的话题是关于动态IP和网络的关系。也许有些小伙伴对这个概念还比较陌生&#xff0c;但别担心&#xff0c;我会简单明了的给你理清楚。让我们一起看看动态IP到底能否影响到网络。 首先&#xff0c;我们先来搞明白什么是动态IP。在互联网世界中&#xff0c;每一个连…...

Linux学习笔记-常用指令说明

本文目录 一、Linux指令笔记 二、"授人以鱼,不如授人以渔" 一、Linux指令笔记 0、cd 命令是 change dir 的简写&#xff0c;它可以把终端当前所在的路径切换至目标路径。 1、mkdir 建立文件夹。是 make directory 的简写&#xff0c;它可以在文件系统中创建一个新的目…...

MyBatisPlus进阶版

1.映射 1.1自动映射 【1】表名和实体类名映射 -> 表名user 实体类名User 【2】字段名和实体类属性名映射 -> 字段名name 实体类属性名name 【3】字段名下划线命名方式和实体类属性小驼峰命名方式映射 -> 字段名 user_email 实体类属性名 userEmail MybatisPlus…...

安防视频云平台EasyNVR视频汇聚平台硬件无法进入服务器的问题处理方法

EasyNVR是基于RTSP/Onvif协议的视频接入、处理及分发的安防视频云平台&#xff0c;可提供的视频能力包括&#xff1a;设备接入、实时视频直播、录像、云存储、录像回放与检索、告警、级联等&#xff0c;平台可支持将接入的视频流进行全平台、全终端的分发&#xff0c;分发的视频…...

流媒体内容分发终极解决方案:当融合CDN与P2P视频交付结合

前言 随着互联网的发展&#xff0c;流媒体视频内容日趋增多&#xff0c;已经成为互联网信息的主要承载方式。相对传统的文字&#xff0c;图片等传统WEB应用&#xff0c;流媒体具有高数据量&#xff0c;高带宽、高访问量和高服务质量要求的特点&#xff0c;而现阶段互联网“尽力…...

根据源码,模拟实现 RabbitMQ - 内存数据管理(4)

目录 一、内存数据管理 1.1、需求分析 1.2、实现 MemoryDataCenter 类 1.2.1、ConcurrentHashMap 数据管理 1.2.2、封装交换机操作 1.2.3、封装队列操作 1.2.4、封装绑定操作 1.2.5、封装消息操作 1.2.6、封装未确认消息操作 1.2.7、封装恢复数据操作 一、内存数据管理…...

Apache Flume架构和原理

Apache Flume是一个开源的分布式、可靠的日志收集和聚合系统,旨在将大量的日志数据从不同的数据源(如应用程序、服务器、设备)收集到中心存储或数据湖中。Flume的架构设计允许用户在大规模数据流的情况下实现可靠的数据传输和处理。 Flume特性 Apache Flume是一个用于收集…...

代码随想录算法训练营day38 | LeetCode 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

509. 斐波那契数&#xff08;题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台&#xff09; 思路&#xff1a;经典的dp题。 int fib(int n){if(n 0 || n 1) return n;return fib(n-1) fib(n-2); } 70. 爬楼梯&#xff08;题目…...

Linux基本指令【下】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析3 目录 &#x1f449;&#x1f3fb;cat&#x1f449;&#x1f3fb;echo&#xff08;输出…...

向量检索:基于ResNet预训练模型构建以图搜图系统

1 项目背景介绍 以图搜图是一种向量检索技术&#xff0c;通过上传一张图像来搜索并找到与之相关的其他图像或相关信息。以图搜图技术提供了一种更直观、更高效的信息检索方式。这种技术应用场景和价值非常广泛&#xff0c;经常会用在商品检索及购物、动植物识别、食品识别、知…...

SpringBoot 响应头添加版本号、打包项目后缀添加版本号和时间

文章目录 响应头添加版本号获取版本号添加响应处理器请求结果 打包项目后缀添加版本号和时间实现打包结果 响应头添加版本号 获取版本号 在 pom.xml 中&#xff0c;在 project.version 下定义版本号 在 application.yml 获取 pom.xml 中 project.version 中的信息 添加响应处…...

优化指南:带宽限制的可行策略

大家好&#xff01;作为一名专业的爬虫程序员&#xff0c;我们经常面临的一个挑战就是带宽限制。尤其是在需要快速采集大量数据时&#xff0c;带宽限制成为了我们提升爬虫速度的一大阻碍。今天&#xff0c;我将和大家分享一些解决带宽限制的可行策略&#xff0c;希望能帮助大家…...

计算机提示mfc120u.dll缺失(找不到)怎么解决

在计算机领域&#xff0c;mfc120u.dll是一个重要的动态链接库文件。它包含了Microsoft Foundation Class (MFC) 库的特定版本&#xff0c;用于支持Windows操作系统中的应用程序开发。修复mfc120u.dll可能涉及到解决与该库相关的问题或错误。这可能包括程序崩溃、运行时错误或其…...

Java基于SpringBoot+Vue实现酒店客房管理系统(2.0 版本)

文章目录 一、前言介绍二、系统结构三、系统详细实现3.1用户信息管理3.2会员信息管理3.3客房信息管理3.4收藏客房管理3.5用户入住管理3.6客房清扫管理 四、部分核心代码 博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云…...

微服务架构2.0--云原生时代

云原生 云原生&#xff08;Cloud Native&#xff09;是一种关注于在云环境中构建、部署和管理应用程序的方法和理念。云原生应用能够最大程度地利用云计算基础设施的优势&#xff0c;如弹性、自动化、可伸缩性和高可用性。这个概念涵盖了许多方面&#xff0c;包括架构、开发、…...

C++day2作业(2023.8.22)

1.定义一个学生的结构体&#xff0c;包含学生的姓名&#xff0c;年龄&#xff0c;成绩&#xff0c;性别&#xff0c;学生的成绩&#xff0c;姓名&#xff0c;定义为私有权限&#xff1b;定义一个学生类型的结构体变量&#xff0c;设置公有函数用于给学生的成绩和名字进行赋值&a…...

硅谷创新精神:从车库、真空管到一美元年薪的启示

1. 硅谷创新精神的物理原点&#xff1a;从车库到孤寂的一美元在科技圈待久了&#xff0c;总会听到一些传奇故事&#xff0c;比如乔布斯在车库里组装第一台苹果电脑&#xff0c;或者惠普的两位创始人在车库里捣鼓出第一个音频振荡器。这些故事被反复传颂&#xff0c;几乎成了硅谷…...

算法将驱动一切:边缘AI智能体如何重塑智能系统

仓库装卸区的安全摄像头每天采集86400秒的视频数据。长途卡车上的车队远程信息记录仪在两次加油之间积累了数GB的行车影像。外科手术机器人的立体摄像头以每秒60帧的速度生成密集点云。所有这些数据都产生于数字世界与现实世界的交界处&#xff0c;但几乎没有任何一条被用于智能…...

【仅开放72小时】:Gemini Workspace与Microsoft Entra ID双向同步的密钥轮换脚本(含自动审计日志生成器)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Gemini Workspace整合方案概述 Gemini Workspace 是 Google 推出的面向企业级 AI 协作的统一平台&#xff0c;其核心价值在于将 Gemini 模型能力深度嵌入办公套件&#xff08;如 Gmail、Drive、Docs、M…...

别再只点CubeMX的SDRAM选项了!STM32F429IGT6外扩W9825G6KH内存的完整驱动与读写测试指南

STM32F429IGT6外扩W9825G6KH内存实战&#xff1a;从CubeMX配置到完整驱动开发的深度解析 如果你正在使用STM32F429IGT6开发板&#xff0c;并且需要扩展大容量内存&#xff0c;W9825G6KH-6I这颗32MB的SDRAM芯片可能已经在你的硬件清单上。许多开发者习惯性地依赖STM32CubeMX生成…...

Tinke:免费开源NDS游戏资源提取工具,轻松解密任天堂DS游戏文件

Tinke&#xff1a;免费开源NDS游戏资源提取工具&#xff0c;轻松解密任天堂DS游戏文件 【免费下载链接】tinke Viewer and editor for files of NDS games 项目地址: https://gitcode.com/gh_mirrors/ti/tinke 你是否曾好奇NDS游戏内部藏着什么秘密&#xff1f;想要提取…...

前端八股文面经大全:上海威派格前端实习(2026-05-07)·面经深度解析

前言 大家好&#xff0c;我是木斯佳。 相信很多人都感受到了&#xff0c;在AI浪潮的席卷之下&#xff0c;前端领域的门槛在变高&#xff0c;纯粹的“增删改查”岗位正在肉眼可见地减少。曾经热闹非凡的面经分享&#xff0c;如今也沉寂了许多。但我们都知道&#xff0c;市场的…...

微信自动化终极指南:5个强大功能助你高效管理微信数据

微信自动化终极指南&#xff1a;5个强大功能助你高效管理微信数据 【免费下载链接】wechat-toolbox WeChat toolbox&#xff08;微信工具箱&#xff09; 项目地址: https://gitcode.com/gh_mirrors/we/wechat-toolbox 还在为繁琐的微信数据管理而烦恼吗&#xff1f;微信…...

基于ConvLSTM与天气图的时空序列预测:新能源功率预测实战

1. 项目概述与核心价值最近几年&#xff0c;我身边不少做新能源电站运维和电力交易的朋友&#xff0c;都在为一个问题头疼&#xff1a;发电量预测不准。无论是光伏电站还是风电场&#xff0c;发电功率就像个“看天吃饭”的孩子&#xff0c;云层一遮&#xff0c;风速一变&#x…...

终极窗口调整神器:WindowResizer完整使用指南

终极窗口调整神器&#xff1a;WindowResizer完整使用指南 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些顽固的Windows窗口而烦恼吗&#xff1f;无论你是遇到老旧软件界…...

AD导出Gerber到CAM350拼板全流程避坑指南(附文件漏导出自查清单)

AD导出Gerber到CAM350拼板全流程避坑指南&#xff08;附文件漏导出自查清单&#xff09; 在硬件产品开发中&#xff0c;PCB设计到生产的转换环节往往隐藏着诸多"暗礁"。我曾亲眼见过一个团队因为钻孔文件覆盖问题导致生产延误两周&#xff0c;损失近十万元。本文将分…...