【C++】第十四节—模版进阶(非类型模版参数+模板的特化+模版分离编译+模版总结)

【C++】第十四节—模版进阶(非类型模版参数+模板的特化+模版分离编译+模版总结)

你好,我是云边有个稻草人 

C++—本文章所属专栏,欢迎订阅,持续更新中!

目录

一、非类型模板参数

【非类型模版参数的用处在哪里? 】

【了解array 容器—array和普通数组的区别在哪里?—对越界的检查】

二、模板的特化(特殊化处理)

2.1 概念

2.2 函数模版特化

【函数模版特化可使用,但不推荐】 

2.3 类模版特化

【全特化】

【偏特化】

 【判断走哪个类模版?】

【类模版特化应用实例】

三、模版分离编译

3.1 什么是分离编译

3.2 模板的分离编译

 【分析】

3.3 解决办法

【分离定义扩展阅读】

四、模板总结

【优点】

【缺陷】


正文开始——

一、非类型模板参数

模板参数分为类型形参非类型形参

类型形参:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。

非类型形参:就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。

注意:浮点数、类对象以及字符串是不允许作为非类型模板参数的。非类型的模板参数必须在编译期就能确认结果。类型模版参数和非类型模版参数都可以用缺省值,但是非类型模版参数是有限制的,只能用整型类型,浮点型,类类型等都是不可以的!
【非类型模版参数的用处在哪里? 】
#include<iostream> using namespace std; //#define N 10//宏定义 //只支持整型 template<class T,size_t N = 10>//非类型模版参数可以给缺省值 class Stack { private: T _a[N]; int _top; }; ////C++20以后才支持浮点数 //template<class T, double N = 10.1>//非类型模版参数可以给缺省值 //class Array //{ //private: //}; int main() { Stack<int,20> st1; Stack<int,200> st2; Stack<int> st3; return 0; }
【了解array 容器—array和普通数组的区别在哪里?—对越界的检查】

二、模板的特化(特殊化处理)

2.1 概念

通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果,需要特殊处理。

比如:实现了一个专门用来进行小于比较的函数模板

class Date { public: Date(int year = 2025, int month = 7, int day = 9) :_year(year) , _month(month) , _day(day) { } bool operator<(const Date& d)const { return (_year < d._year) || (_year == d._year && _month < d._month) || ((_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() { Date d1(2025, 7, 9); Date d2(2025, 9, 9); Date* p1 = new Date(2025, 8, 9); Date* p2 = new Date(2025, 10, 9); cout << Less(1, 2) << endl;//可以判断,结果正确 cout << Less(d1, d2) << endl;//可以判断,结果正确 cout << Less(p1, p2) << endl;//结果随机。其实这里是对new出来的地址进行比较,当然是随机,那怎么办?—特化! return 0; }

可以看到,Less绝对多数情况下都可以正常比较,但是在特殊场景下就得到错误的结果。上述示例中,p1指向的d1显然小于p2指向的d2对象,但是Less内部并没有比较p1和p2指向的对象内容,而比较的是p1和p2指针的地址,这就无法达到预期而错误。 此时,就需要对模板进行特化。即:在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。模板特化中分为函数模板特化类模板特化

2.2 函数模版特化

函数模板的特化步骤:

    Read more

    idea-claude-code-gui——Atomgit平台上的新玩具-不降智版本

    idea-claude-code-gui——Atomgit平台上的新玩具-不降智版本

    开源地址 gitcode:https://gitcode.com/zhukunpenglinyutong/idea-claude-code-gui github:https://github.com/zhukunpenglinyutong/idea-claude-code-gui  请留下你的star 目录 开源地址 核心价值 使用效果 安装与使用 具体配置 账号注册与登录 创建APIKey 配置操作 配置APIKey 效果测试 难度测试 模型show 额外总结 一、插件核心信息 二、安装与配置流程 三、功能测试效果 四、适用场景 核心价值 为开发者提供可视化操作界面,集成 Claude Code 和 OpenAI Codex 双 AI 工具,助力 AI 辅助编程,

    By Ne0inhk
    安装openclaw时出现npm error code ENOENT npm error syscall spawn git报错的解决方案

    安装openclaw时出现npm error code ENOENT npm error syscall spawn git报错的解决方案

    大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为ZEEKLOG博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理解,而且能够帮助新手快速入门。 本文主要介绍了安装openclaw时出现npm error code ENOENT npm error syscall spawn git报错的解决方案,希望能对使用openclaw的同学们有所帮助。 文章目录 * 1. 问题描述 * 2. 解决方案 1. 问题描述 今天在使用命令安装openclaw时,却出现了npm error code ENOENT和npm error syscall spawn git的错误提示,具体报错信息如下图所示: 在经过了亲身的实践后,终于找到了解决问题的方案,最终将逐步的操作过程总结如下。希望能对遇到同样bug的同学们有所帮助。

    By Ne0inhk
    2025年全球AI大模型格局:技术突破、开源崛起与未来趋势

    2025年全球AI大模型格局:技术突破、开源崛起与未来趋势

    个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[[email protected]] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? * 专栏导航: 码农阿豪系列专栏导航 面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️ Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻 Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡 全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀 目录 * 2025年全球AI大模型格局:技术突破、开源崛起与未来趋势 * 一、2025年全球AI大模型综合排名 * 1. Top 5 综合能力最强的大模型 * 二、细分领域领先模型 * 1. 编程与代码生成

    By Ne0inhk

    Cloudflare 部署 GitHub MoonTV 全流程:免费追剧重点环节解析

    准备工作 确保已注册 Cloudflare 账号并拥有域名(支持免费子域名)。GitHub 账号需提前准备,用于托管 MoonTV 项目文件。 域名解析配置 在 Cloudflare 控制面板添加域名,按提示修改 DNS 服务器为 Cloudflare 提供的地址。完成验证后,进入 DNS 设置页面,添加 A 记录指向 GitHub Pages 的 IP 地址(如 185.199.108.153),或使用 CNAME 记录指向 username.github.io。 GitHub 仓库设置 创建新仓库并上传 MoonTV 前端代码(HTML/CSS/JS

    By Ne0inhk