函数模板的具体化
函数模板优点是通用性,可以解决某个方面的普遍性问题,但是这个世界上的事情不是绝对的,有普遍的,就有绝对的。举个栗子:
#include <iostream>
using namespace std;
template <typename T>
void Swap(T &a,T &b) {T temp = a;a = b;b = temp;return ;
}
class CGirl {public:int m_bk;//编号string m_name; //姓名int m_rank; //排名
};int main() {return 0;
}
我要是只想用这个Swap函数交换超女类的排名,不交换其他成员,这样的话swap函数模板中现有的代码就不合适了;
——————————————————————————————————————————
为了满足特殊的需求,可以提供一个具体化的函数,当编译器找到与函数调用匹配的具体化定义时,将使用该定义,不再寻找模板。————函数模板的具体化!!
语法:
template <> void 函数模板名 (参数列表)
{
//函数体;
}
#include <iostream>
using namespace std;class CGirl {public:int m_bk;//编号string m_name; //姓名int m_rank; //排名
};
template <typename T>
void Swap(T &a,T &b) {T temp = a;a = b;b = temp;return ;
}
//具体化函数:
template <> void Swap<CGirl>(CGirl& g1, CGirl& g2)
//template <> void Swap(CGirl& g1, CGirl& g2) 这两种方法是一样的;
{int temp = g1.m_rank;g1.m_rank = g2.m_rank;g2.m_rank = temp;cout << "带哦用的Swap(CGirl &g1,CGirl &g2)\n";return ;
}int main() {int a = 10, b = 20;Swap(a, b);cout << "a = " << a << ", b = " << b << endl;CGirl g1, g2;g1.m_rank = 1;g2.m_rank = 2;Swap(g1, g2);cout << "g1.m_rank = " << g1.m_rank << " , g2.m_rank = " << g2.m_rank << endl;return 0;
}
对于给定的函数名,可以有普通函数,函数模板和具体化的函数模板,以及他们的重载版本;
编译器用用各种函数的规则:
1:具体化优先于常规模板,普通函数优先于具体化和常规模板;
2:如果希望使用函数模板,可以用空模板参数强制使用函数模板;
3:如果函数模板能产生更好的匹配,将优先于普通函数。
#include <iostream>
using namespace std;void Swap(int a , int b) {cout << "使用了普通函数。\n";
}
template <typename T>
void Swap(T a,T b) {cout << "使用了函数模板。\n";
}
//具体化函数:
template <>
void Swap(int a,int b)
{cout << "使用了具体化的函数模板。\n";
}int main() {Swap(1, 2);return 0;
}
普通函数优先于函数模板,所以编译器选择第一个,普通函数;
使用了普通函数。C:\Users\代伟业\Desktop\C++\初始化列表\this指针\x64\Debug\this指针.exe (进程 23260)已退出,代码为 0。
按任意键关闭此窗口. . .
如果把普通函数注释掉:选择了具体化的函数模板:
#include <iostream>
using namespace std;//void Swap(int a , int b) {
// cout << "使用了普通函数。\n";
//}
template <typename T>
void Swap(T a,T b) {cout << "使用了函数模板。\n";
}
//具体化函数:
template <>
void Swap(int a,int b)
{cout << "使用了具体化的函数模板。\n";
}int main() {Swap(1, 2);return 0;
}
使用了具体化的函数模板。C:\Users\代伟业\Desktop\C++\初始化列表\this指针\x64\Debug\this指针.exe (进程 13556)已退出,代码为 0。
按任意键关闭此窗口. . .
如果把具体化版本的代码注释掉,再运行,只能使用函数模板了:
#include <iostream>
using namespace std;//void Swap(int a , int b) {
// cout << "使用了普通函数。\n";
//}
template <typename T>
void Swap(T a,T b) {cout << "使用了函数模板。\n";
}
//具体化函数:
//template <>
//void Swap(int a,int b)
//{
// cout << "使用了具体化的函数模板。\n";
//}int main() {Swap(1, 2);return 0;
}
使用了函数模板。C:\Users\代伟业\Desktop\C++\初始化列表\this指针\x64\Debug\this指针.exe (进程 21920)已退出,代码为 0。
按任意键关闭此窗口. . .
----------
如果不想使用普通函数,想使用函数模板,可以加空模板参数:
#include <iostream>
using namespace std;void Swap(int a , int b) {cout << "使用了普通函数。\n";
}
template <typename T>
void Swap(T a, T b) {cout << "使用了函数模板。\n";
}
//具体化函数:
template <>
void Swap(int a,int b)
{cout << "使用了具体化的函数模板。\n";
}int main() {Swap<>(1, 2);return 0;
}
使用了具体化的函数模板。C:\Users\代伟业\Desktop\C++\初始化列表\this指针\x64\Debug\this指针.exe (进程 23204)已退出,代码为 0。
按任意键关闭此窗口. . .
如果把具体化版本的代码注释掉,再运行,只能使用函数模板了:
相关文章:
函数模板的具体化
函数模板优点是通用性,可以解决某个方面的普遍性问题,但是这个世界上的事情不是绝对的,有普遍的,就有绝对的。举个栗子: #include <iostream> using namespace std; template <typename T> void Swap(T &…...

【Linux 内存管理】
文章目录 1. 为什么要有虚拟内存呢?🔍 1. 为什么要有虚拟内存呢?🔍...
AJAX 数据库
AJAX 数据库 1. 引言 AJAX(Asynchronous JavaScript and XML)是一种流行的网络开发技术,它允许网页在不重新加载整个页面的情况下与服务器交换数据和更新部分网页内容。AJAX技术与数据库的结合,为现代网络应用提供了更加丰富和动态的用户体验。本文将探讨AJAX如何与数据库…...
力扣719.找出第K小的数对距离
力扣719.找出第K小的数对距离 二分答案 朴素版 双指针遍历数组 超过界限break auto check [&](int mid) -> bool{int res0;for(int i0;i<n-1;i)for(int ji1;j<n;j){if(nums[j] - nums[i] > mid) break;elseif(res > k) return true;}return false;};优…...
富格林:掌握可信出金交易策略
富格林认为,黄金市场是起起落落,似乎机遇无处不在,但很少有人能真正抓住机遇。黄金可以做多也可以做空,做空主要是为了从黄金价格波动的价差中获利。只有采用正规可信的操作技巧,才能实现顺利获利出金,减少…...

HCS-华为云Stack-容器网络
HCS-华为云Stack-容器网络 容器隧道overlay VPC网络...

【CSS in Depth2精译】1.1 层叠
CSS 本质上就是声明规则,并让这些特定的规则在各种情况下生效。一个类添加到某个元素上,则应用这个类包含的这一些样式;元素 X 是元素 Y 的一个子节点,则应用另一些样式。浏览器于是根据这些规则,判定所有样式生效的具…...

【读博日记】拓扑结构(待修正)
Topology 拓扑学 内容来源于互联网,还在甄别中——20240617 拓扑结构指把实体抽象成与其形状大小无关的点,把连接实体的线路抽象成线,再研究这些电线之间的关系。 所谓相似的拓扑结构: 例如一个圆环变成正方形、长方形、三角形…...
QT 中setVisible()和setEnabled()的区别
setVisible(bool)和setEnabled(true)在PyQt(以及其他类似的图形用户界面框架)中分别用于控制控件的可见性和可用性,它们之间的主要区别如下: setVisible(bool) 功能:这个函数用于设置QWidget控件的可见状态。参数&am…...

【YashanDB知识库】PHP使用ODBC使用数据库绑定参数功能异常
【问题分类】驱动使用 【关键字】ODBC、驱动使用、PHP 【问题描述】 PHP使用PDO_ODBC连接yashan数据库,使用绑定参数获取数据时,客户现场出现报错 本地复现未出现异常报错,但是无法正确获取数据。 【问题原因分析】开启ODBC报错日志后&am…...

初级篇-Docker容器知识
Docker容器 容器主要是解决跨平台、跨服务运行环境的问题 容器将运行业务应用所需要的东西进行打包,包括依赖项、配置、脚本、二进制文件等。在容器中运行镜像,不用担心不同环境下运行不一致的问题。 容器本质上是一个特殊的进程,将资源、…...

【抽代复习笔记】19-群(十三):奇偶置换、循环置换的几个定理及例题
定义: ①在Sn中,能够表示为奇数多个对换乘积的置换称为“奇置换”,能够表示为偶数多个对换乘积的置换称为“偶置换”; ②所有偶置换的集合记为An。 例1:(1)计算S1和S2中奇、偶置换的数目&…...

RT-Thread简介及启动流程分析
阅读引言: 最近在学习RT-Thread的内部机制,觉得这个启动流程和一些底层原理还是挺重要的, 所以写下此文。 目录 1, RT-Thread简介 2,RT-Thread任务的几种状态 3, 学习资源推荐 4, 启动流程分…...
MCU嵌入式AI开发笔记-视频笔记同步更新
MCU嵌入式AI开发笔记 抖音B站等站点笔记视频同步更新 01嵌入式AI大的方向 STM32跑神经网络 http://news.eeworld.com.cn/mp/EEWorld/a134877.jspx 为什么可以在STM32上面跑神经网络?简而言之就是使用STM32CubeMX中的X-Cube-AI扩展包将当前比较热门的AI框架进行C代码的转化,…...

DoIP——step2:车辆发现
文章目录 前言一、IP地址配置1.1 AutoIP1.2 DHCP1.3 DoIP实体的IP地址配置流程二、车辆发现车辆声明报文内容如下:前言 完成诊断设备到车辆的物理连接并通过激活线使能诊断连接后边缘节点将会将连接状态传递至应用层,在开始车辆发现过程之前,需要先进行各自的IP地址配置,获…...

【动态规划】0-1背包问题
【动态规划】0-1背包问题 题目:现在有四个物品,背包总容量为8,背包最多能装入价值为多少的物品? 我的图解 表格a【i】【j】表示的是容量为j的背包装入前i个物品的最大价值。 拿a【1】【1】来说,它的值就是背包容量为1,只考虑…...

WordPress 高级缓存插件 W3 Total Cache Pro 详细配置教程
说起来有关 WordPress 缓存插件明月已经发表过不少文章了,但有关 W3 Total Cache Pro 这个 WordPress 高级缓存插件除了早期【网站缓存插件 W3 Total Cache,适合自己的才是最好的!】一文后就很少再提及了,最近因为明月另一个网站【玉满斋】因为某些性能上的需要准备更换缓存…...

每日一题——Python实现PAT乙级1012 数字分类(举一反三+思想解读+逐步优化)五千字好文
一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码优点 代码缺点 时间复杂度 空间复杂度 代码改进建议 我要更强 哲…...

Unity2D游戏制作入门 | 13 ( 之人物三段攻击 )
上期链接:Unity2D游戏制作入门 | 12(之人物受伤和死亡的逻辑动画)-CSDN博客 上期我们聊了人物的受伤和死亡的逻辑和动画,我们主要学习了事件的执行,即我们在人物受伤时可能会触发很多的事件,比如触发人物受伤的动画以及播放音乐等…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...

门静脉高压——表现
一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...
精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑
精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑 在电子商务领域,转化率与网站性能是决定商业成败的核心指标。今天,我们将深入解析不同类型电商平台的转化率基准,探讨页面加载速度对用户行为的…...
如何让非 TCP/IP 协议驱动屏蔽 IPv4/IPv6 和 ARP 报文?
——从硬件过滤到协议栈隔离的完整指南 引言 在现代网络开发中,许多场景需要定制化网络协议(如工业控制、高性能计算),此时需确保驱动仅处理特定协议,避免被标准协议(如 IPv4/IPv6/ARP)干扰。本文基于 Linux 内核驱动的实现,探讨如何通过硬件过滤、驱动层拦截和协议栈…...
Spring Boot SQL数据库功能详解
Spring Boot自动配置与数据源管理 数据源自动配置机制 当在Spring Boot项目中添加数据库驱动依赖(如org.postgresql:postgresql)后,应用启动时自动配置系统会尝试创建DataSource实现。开发者只需提供基础连接信息: 数据库URL格…...

HarmonyOS-ArkUI 自定义弹窗
自定义弹窗 自定义弹窗是界面开发中最为常用的一种弹窗写法。在自定义弹窗中, 布局样式完全由您决定,非常灵活。通常会被封装成工具类,以使得APP中所有弹窗具备相同的设计风格。 自定义弹窗具备的能力有 打开弹窗自定义布局,以…...