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

模板的特化

模板的特化

  • 1.概念
  • 2.函数模板特化
  • 3.类模板的特化
    • 3.1 全特化
    • 3.2 偏特化
      • 3.2.1 部分特化
      • 3.2.2 参数更进一步的限制
  • 4.总结

1.概念

在原模板类的基础上,针对特殊类型所进行特殊化的实现方式

2.函数模板特化

步骤

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

#include <iostream>
using namespace std;
//先创建一个日期类
class Date
{
public:Date(int year, int month, int day):_year(year), _month(month), _day(day){cout << "Date(int year, int month, int day)" << endl;}bool operator<(const Date& d){if (_year < d._year)return true;else if (_year == d._year){if (_month < d._month){return true;}else if (_month == d._month){return _day < d._day;}}return false;}bool operator==(const Date& d){return _year == d._year && _month == d._month && _day == d._day;}
private:int _year;int _month;int _day;
};
// 函数模板 -- 参数匹配
template<class T>
bool Less(T left, T 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 = &d1;Date* p2 = &d2;cout << Less(p1, p2) << endl; //可以比较就,结果错误return 0;
}

上述示例中,p1指向的d1显然小于p2指向的d2对象,但是Less内部并没有比较p1,p2指向对象的内容,而比较的是p1,p2指针的地址,这就无法达到预期的答案。
此时需要对函数模板进行特化

// 对Less函数模板进行特化
template<>
bool Less<Date*>(Date * left, Date * right)
{return *left < *right;
} 

注意:一般情况下,如果函数模板遇到不能处理或者处理有误的类型,为了实现简单通常都是将改函数直接给出

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

该种实现简单明了,代码的可读性高,容易书写。

3.类模板的特化

3.1 全特化

全特化:是将模板参数列表中所有的参数都确定化

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;
};

3.2 偏特化

3.2.1 部分特化

将模板参数类表中的一部分参数特化

template<class T1, class T2>
class Data
{
public :Data() { cout << "Data<T1, T2>" << endl; }
private:T1 _d1;T2 _d2;
};
//偏特化
// 将第二个参数特化为int
template <class T1>
class Data<T1, int>
{
public :Data() { cout << "Data<T1, int>" << endl; }
private:T1 _d1;int _d2;
};

3.2.2 参数更进一步的限制

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

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

4.总结

优点:

  • 模板复用了代码,节省资源
  • 增强了代码的灵活性

缺点:

  • 模板会导致代码膨胀问题,也会导致编译时间变长
  • 出现模板编译错误时,错误信息非常凌乱,不易定位错误

相关文章:

模板的特化

模板的特化 1.概念2.函数模板特化3.类模板的特化3.1 全特化3.2 偏特化3.2.1 部分特化3.2.2 参数更进一步的限制 4.总结 1.概念 在原模板类的基础上&#xff0c;针对特殊类型所进行特殊化的实现方式 2.函数模板特化 步骤 1.必须要先有一个基础的函数模板 2.关键字 template后面接…...

PCIE总线架构

1 概述 PCIe总线(Peripheral Component Interconnect Express)是一种高速串行计算机扩展总线标准,它是基于PCI总线的一种升级版,现在已经被广泛应用于各种高性能的计算机和服务器系统中。 PCIe总线提供更高的数据传输速度和更先进的特性,它主要特点如下: 高带宽:提供比…...

Adobe PR与AE的区别与联系(附网盘地址)

从事视频后期制作的小伙伴&#xff0c;对于PR&#xff08;Premiere&#xff09;和AE&#xff08;After Effects&#xff09;应该不会陌生。随着短视频的兴起&#xff0c;就连我们普通用户&#xff0c;拍摄完视频&#xff0c;都会去糟取精的剪辑一下&#xff0c;而PR正是一款功能…...

【QT 5 调试软件+Linux下调用脚本shell-无法调度+目录拼写+无法找目录+sudo权限(2)+问题解决方式+后续补充】

【QT 5 调试软件Linux下调用脚本shell-无法调度目录拼写无法找目录sudo权限&#xff08;2&#xff09;问题解决方式后续补充】 1、前言2、问题综述&#xff1a;自研qt上位机无法调度脚本&#xff08;1&#xff09;可能原因1&#xff1a;无法找到目录情况说明&#xff1a;解决思…...

企业防泄密妙招有哪些?请记住这8招!超实用,学起来!

在古代&#xff0c;有云&#xff1a;“密者&#xff0c;德之高也&#xff1b;事以密成&#xff0c;语以泄败。” 这些谚语不仅是对忠诚守密的高度赞扬&#xff0c;更是对保密工作重要性的深刻阐述。 在现代企业中&#xff0c;数据泄露已成为不容忽视的严峻挑战。 如何有效防止…...

pytorch千问模型源码分析

# 规范化技术&#xff0c;旨在替代传统的 Layer Normalization&#xff08;LN&#xff09; # 核心思想是对输入张量的每个样本的每个特征进行规范化&#xff0c;使其均值为 0&#xff0c;方差为 1 class Qwen2RMSNorm(nn.Module): def __init__(self, hidden_size, eps1e-6…...

滚雪球学SpringCloud[1.3]:SpringCloud环境搭建

全文目录&#xff1a; 前言1.3.1 环境要求1. JDK2. Maven3. IDE4. 其他工具 1.3.2 初始化Spring Boot项目方法一&#xff1a;使用Spring Initializr方法二&#xff1a;使用IDE项目结构 1.3.3 引入Spring Cloud依赖1. 更新pom.xml2. 添加Spring Cloud Starter依赖3. 示例完整的p…...

9.28今日错题解析(软考)

目录 前言面向对象技术——UML软件工程——软件能力成熟度模型&#xff08;CMM&#xff09;程序设计语言——编译 前言 这是用来记录我备考软考设计师的错题的&#xff0c;今天知识点为UML、软件能力成熟度模型&#xff08;CMM&#xff09;和编译&#xff0c;大部分错题摘自希…...

【Vue】以RuoYi框架前端为例,ElementUI封装图片上传组件——将图片信息转成base64后提交到后端保存

RuoYi 框架本身对于图片上传功能&#xff0c;在ElementUI的 <el-upload> 组件的基础装封装了 /components/ImageUpload/index.vue 组件。本组件就是在 RuoYi 自定义的 <ImageUpload> 组件的基础上进行改造&#xff0c;将图片的信息在上传之前处理成 base64 格式&am…...

【Linux】驱动的基本架构和编译

驱动源码 /** Silicon Integrated Co., Ltd haptic sih688x haptic driver file** Copyright (c) 2021 kugua <daokuan.zhusi-in.com>** This program is free software; you can redistribute it and/or modify it* under the terms of the GNU General Public Licen…...

1013. 将数组分成和相等的三个部分 数组切分

1013. 将数组分成和相等的三个部分 已解答 简单 相关标签 相关企业 提示 给你一个整数数组 arr&#xff0c;只有可以将其划分为三个和相等的 非空 部分时才返回 true&#xff0c;否则返回 false。 形式上&#xff0c;如果可以找出索引 i 1 < j 且满足 (arr[0] arr[…...

【深度学习】—— 自动微分、非标量变量的反向传播、 分离计算、 Python控制流的梯度计算

【深度学习】—— 自动微分 自动微分一个简单的例子 非标量变量的反向传播分离计算Python控制流的梯度计算 自动微分 求导是⼏乎所有深度学习优化算法的关键步骤。虽然求导的计算很简单&#xff0c;只需要⼀些基本的微积分。但对于复杂的模型&#xff0c;⼿⼯进⾏更新是⼀件很…...

Java项目实战II基于Java+Spring Boot+MySQL的大学城水电管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 随着大学城规模的不断扩大和学生数量的急剧增加&#xff0c;大学城内的水电管理面临着前所未有的挑战…...

Vue 组件的三大组成部分详解

文章目录 模板&#xff08;template&#xff09;脚本&#xff08;script&#xff09;样式&#xff08;style&#xff09;总结 在 Vue.js 中&#xff0c;组件是构建用户界面的重要基石。一个 Vue 组件通常由三个主要部分组成&#xff1a;模板&#xff08;template&#xff09;、…...

深入理解Java内部类

一、什么是内部类 内部类是定义在另一个类内部的类。内部类与外部类&#xff08;Enclosing Class&#xff09;之间存在着紧密的联系&#xff0c;可以访问外部类的成员变量和方法&#xff0c;这使得它们在某些场景下非常有用。 1.1 内部类的分类 Java中的内部类主要有以下几种…...

fiddler抓包12_篡改请求(请求前断点)

课程大纲 原理 正常“客户端-服务器”通信&#xff0c;即发送请求&#xff0c;接收返回。 Fiddler抓包是「客户端-浏览器」进行交互时&#xff0c;请求和响应都会从Fiddler通过&#xff0c;Fiddler可以捕获并展示。 请求前断点&#xff08;BreakPoint Before Request&#xff0…...

Webpack和GuIp打包原理以及不同

Webpack打包原理 Webpack的打包原理主要基于模块化的概念&#xff0c;它将应用程序中的所有资源&#xff08;如JS、CSS、图片等&#xff09;视为模块&#xff0c;并根据模块间的依赖关系进行静态分析。Webpack会递归地构建一个依赖关系图&#xff08;dependency graph&#xf…...

c++与Python用笛卡尔的心形函数输出爱心

我突然想到输出爱心是否可以用笛卡尔的心形函数 在IDLE里用Python输出下面这个图形 在小熊猫c里用c输出下面这个图形 如果当你要输出这些的时候会怎么办 低级:纯输出 print( ********* ********* ***************** ***************** …...

Mybatis 9种动态 sql 标签使用

MyBatis提供了9种动态SQL标签&#xff1a;trim、where、set、foreach、if、choose、when、otherwise、bind&#xff1b; 1.if 标签 <select id"getUser">select * from User<where><if test" age ! null ">and age > #{age}</if…...

OpenHarmony(鸿蒙南向)——平台驱动开发【PIN】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 PIN即管脚控制器&#xff0c;用于统一管理各SoC的…...

Python金融数据获取终极指南:3分钟掌握同花顺问财数据获取

Python金融数据获取终极指南&#xff1a;3分钟掌握同花顺问财数据获取 【免费下载链接】pywencai 获取同花顺问财数据 项目地址: https://gitcode.com/gh_mirrors/py/pywencai 想要快速获取高质量的金融数据吗&#xff1f;pywencai是你的完美解决方案。这个Python工具让…...

用PyQt5给树莓派人脸门禁做个图形界面:从Qt Designer设计到移植上板的完整流程

树莓派人脸门禁系统GUI开发实战&#xff1a;从Qt设计到嵌入式部署的全链路解析 当硬件项目需要与用户交互时&#xff0c;一个直观的图形界面往往能大幅提升使用体验。本文将带您完整实现一个基于树莓派的人脸识别门禁系统GUI应用&#xff0c;涵盖从桌面端设计到嵌入式部署的全…...

不只是安装:用MATLAB+RTL-SDR硬件支持包快速上手你的第一个无线信号接收项目

不只是安装&#xff1a;用MATLABRTL-SDR硬件支持包快速上手你的第一个无线信号接收项目 当你第一次将RTL-SDR设备插入电脑&#xff0c;安装完MATLAB硬件支持包后&#xff0c;那种既兴奋又迷茫的感觉可能还记忆犹新。硬件已经就绪&#xff0c;软件也已安装&#xff0c;但接下来该…...

星露谷物语SMAPI终极指南:5分钟解锁无限模组世界

星露谷物语SMAPI终极指南&#xff1a;5分钟解锁无限模组世界 【免费下载链接】SMAPI The modding API for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/smap/SMAPI 你是否曾梦想过让星露谷物语变得更加精彩&#xff1f;想象一下&#xff1a;当你辛苦耕种…...

无感定位技术白皮书——传统ReID跨镜跟踪局限重重,无短板碾压式突破

前言在智慧安防、智慧园区、工业物联网等数字化转型核心场景中&#xff0c;跨摄像头目标追踪与精准定位是支撑场景智能化升级的关键底座。长期以来&#xff0c;ReID&#xff08;行人重识别&#xff09;技术因无需额外硬件部署、可依托目标外观特征实现跨镜身份关联&#xff0c;…...

跨境直播进入“下半场”:2026年值得关注的几个新方向

很多人提到跨境直播&#xff0c;第一反应还是“流量”和“带货”。但如果这两年持续关注行业变化&#xff0c;会发现一个明显趋势&#xff1a;跨境直播正在从“内容竞争”转向“技术能力竞争”。尤其从2025年开始&#xff0c;行业越来越卷的不只是主播&#xff0c;而是整个直播…...

本地AI对话伴侣实战:Electron+llama.cpp部署与调优指南

1. 项目概述&#xff1a;一个桌面端的本地AI对话伴侣最近在折腾本地大语言模型&#xff08;LLM&#xff09;的时候&#xff0c;发现了一个挺有意思的项目&#xff1a;ItsPi3141/alpaca-electron。简单来说&#xff0c;这是一个用 Electron 框架打包的桌面应用程序&#xff0c;它…...

水凝膜、钢化膜、护景贴大对决:一张表看懂该买谁

水凝膜、钢化膜、护景贴大对决&#xff1a;一张表看懂该买谁手机屏幕保护膜主要有三种&#xff1a;水凝膜、普通钢化膜和护景贴&#xff08;悟赫德为代表&#xff09;。很多人不知道它们到底有什么区别&#xff0c;我们从六个维度给你讲清楚。材料结构。水凝膜是单层软塑料&…...

Swift集成飞书生态:使用feishu-swift SDK实现高效开发

1. 项目概述&#xff1a;一个连接飞书与Swift生态的桥梁最近在折腾一个内部工具&#xff0c;需要把iOS App里的某些数据自动同步到飞书文档里&#xff0c;方便团队协作查看。一开始想用飞书官方API直接写&#xff0c;但发现Swift这边原生的HTTP请求和JSON处理起来有点啰嗦&…...

从零构建MCP服务:AI Agent扩展与外部工具集成实战

1. 项目概述&#xff1a;从零构建你的第一个MCP服务最近在AI应用开发圈里&#xff0c;MCP&#xff08;Model Context Protocol&#xff09;这个词的热度越来越高。简单来说&#xff0c;它就像是为AI大模型&#xff08;比如Claude、GPTs&#xff09;连接外部工具和数据源的一套“…...