函数模板的具体化
函数模板优点是通用性,可以解决某个方面的普遍性问题,但是这个世界上的事情不是绝对的,有普遍的,就有绝对的。举个栗子:
#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博客 上期我们聊了人物的受伤和死亡的逻辑和动画,我们主要学习了事件的执行,即我们在人物受伤时可能会触发很多的事件,比如触发人物受伤的动画以及播放音乐等…...
TCN实战:用Python和Keras搭建时序分类模型(附MNIST代码)
TCN实战:用Python和Keras搭建时序分类模型(附MNIST代码) 时序数据分类一直是机器学习领域的核心挑战之一。传统RNN架构虽然广泛应用,但其训练复杂度高、并行性差的缺陷日益凸显。2018年提出的时域卷积网络(TCN…...
Arroyo分布式流处理引擎的完整测试策略指南:单元测试、集成测试与SQL测试框架详解
Arroyo分布式流处理引擎的完整测试策略指南:单元测试、集成测试与SQL测试框架详解 【免费下载链接】arroyo Distributed stream processing engine in Rust 项目地址: https://gitcode.com/gh_mirrors/ar/arroyo Arroyo是一个用Rust编写的分布式流处理引擎&a…...
研途灵伴学习专项接口支撑与协议收口复盘
摘要 前面的计划、错题本、复习、状态这些后端模块其实都已经能各自工作了,聊天里的动作按钮也能执行。但是当桌面端真的开始接学习页和聊天动作时,问题就出来了: 数据来源太散,页面要自己拼。动作点完以后,前端只知道…...
PID调参不再玄学:用自平衡小车实战,带你搞懂比例、积分、微分到底在干嘛
PID调参实战:用自平衡小车拆解比例、积分、微分的控制艺术 平衡车在桌面上稳稳立住的那一刻,仿佛打破了物理定律——这个看似简单的动作背后,是控制理论中最经典的PID算法在发挥作用。但翻开任何一本自动控制教材,满页的微分方程…...
ACPL-772L-520E,兼容3.3V/5V CMOS逻辑与25MBd高速率传输的栅极驱动光耦
简介今天我要向大家介绍的是 Broadcom 的光电耦合器——ACPL-772L-520E。它的内部由一颗高速发光二极管(LED)和一颗高增益CMOS探测器IC组成。当CMOS逻辑输入端接收到信号时,内部的LED驱动IC会为LED供电。而接收端的探测器IC不仅集成了光电二极…...
5962-88769022A,兼容LSTTL/TTL/CMOS逻辑与6.4mA驱动能力的防抖动逻辑门光耦
简介今天我要向大家介绍的是 Broadcom 的光电耦合器——5962-88769022A。它的每一条通道都由一颗AlGaAs发光二极管和一颗带有迟滞阈值的高增益光子探测器组成。当输入端接收到2mA到8mA的微小电流时,LED便会发光。而接收端的探测器不仅负责捕捉光信号,其内…...
vLLM运行XVERSE-13B-256K报错?可能是tokenizer版本不兼容(附降级解决方案)
解决vLLM运行XVERSE-13B-256K时的Tokenizer版本冲突问题 当你在Linux环境下使用vLLM框架加载XVERSE-13B-256K大模型时,可能会遇到一个令人困惑的错误:"data did not match any variant of untagged enum PyPreTokenizerTypeWrapper"。这个错误…...
收藏!AI时代普通程序员如何转型?3-6个月快速升级指南,小白也能看懂!
AI正改变程序员行业,常规编码任务或被AI替代,但高级岗位和复合型人才需求增加。普通程序员需利用AI提升逻辑思维、问题解决和系统架构能力,转向AI/ML工程、网络安全、科技与工种复合或跨职能岗位。通过每天用AI学习、接副业单等实战方法&…...
League Director:开源英雄联盟录像编辑工具,释放你的游戏视频创作潜能
League Director:开源英雄联盟录像编辑工具,释放你的游戏视频创作潜能 【免费下载链接】leaguedirector League Director is a tool for staging and recording videos from League of Legends replays 项目地址: https://gitcode.com/gh_mirrors/le/l…...
GBase 8a 字符集、排序规则和字符串比较结果偏差
GBase 8a 字符集、排序规则和字符串比较结果偏差 我最近看资料和整理现场问题时,越来越觉得 GBase 8a 里很多“查出来不对”的问题,并不是表没导对,也不是 SQL 逻辑写错了,而是字符集、排序规则、大小写处理和字符串比较语义没有统…...
