c++模板进阶——特化

模板参数:

模板参数分类类型形参与非类型形参。
类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。
非类型形参:就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。

template<class T,int n=10>  //T为模板参数,n为非模板参数
class aa
{
private:T[n] data;
};int main(){aa<int, 100>;return 0;}

注意:
1. 浮点数、类对象以及字符串是不允许作为非类型模板参数的。
2. 非类型的模板参数必须在编译期就能确认结果。

特化:

函数模板的特化步骤:


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

前面三个点都非常简单,第四个点就非常让人头大。

比如我们我们要写这个模板的特化怎么写

template<class T>
void func(const T& data)//实际上换成指针为int* const data//是指针不能修改 
{cout << typeid(data).name() << endl;
}

我们要这样写:

template<>
void func<int*>(int* const& data)  //const放在*之后表示指针本身不能被修改
{cout << typeid(data).name() << endl;
}

如果对c++语法掌握不是很好的话一般都不知道怎么写。 一般用特化我们函数不会用特化。

类模板特化:

类模板的特化和函数模板的特化差不多

template<class T >
class cl
{
public:cl(){cout << "template<class T > " << endl;}
};template<>//全特化
class cl<int*>
{
public:cl(){cout<<"template<>//全特化"<<endl;}
};

除了全特化还有偏特化

偏特化:

任何针对模版参数进一步进行条件限制设计的特化版本。比如对于以下模板类:

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

这样搞的模板就叫偏特化。

因此我们可以通过仿函数和偏特化的特性来写一个比大小功能。

比如我们在设计一个优先级队列时,就可以这样写:

template<class T>
struct less
{less() = default;bool operator()(const T& d1, const T& d2){return d1 < d2;}
};
template<class T>
struct less<T*>
{less() = default;bool operator()(T* d1, T* d2){return *d1 < *d2;}
};template<class T>
struct mygreater
{mygreater()=default;bool operator()(const T& d1, const T& d2){return d1 > d2;}
};
template<class T>
struct mygreater<T*>
{mygreater() = default;bool operator()(T* d1, T* d2){return *d1 > *d2;}};template< class T, class Container = vector<T>,  class func=less<T>>
class priority_queue
{
public:priority_queue()=default;void push(const T& data){_con.push_back(data);Adjust_Up(_con.size()-1);}void pop(){_con.erase(_con.begin());Adjust_Down(0);}T& top(){return _con[0];}bool empty(){return _con.empty();}//向下调整void Adjust_Down(size_t father){func f1;size_t child= father * 2+1;while (child < _con.size()){if (child + 1 < _con.size() && f1(_con[child] , _con[child + 1])){child++;}if (!f1(_con[child] , _con[father])){swap(_con[child], _con[father]);father = child;child = father * 2 + 1;}else{break;}}}//向上调整void Adjust_Up(size_t child){func f1;size_t father = (child - 1) / 2;while (child > 0){if (!f1(_con[child] , _con[father])){swap(_con[child], _con[father]);child = father;father = (child - 1) / 2;}else{break;}}}private:Container _con;
};

对于向下调整,和向上调整的时候,我们就用仿函数,如果当我们传入的是指针他就会生成关于指针的比较的对象,如果不这样做,对象里的比较只能是具体的对象(内置类型,自定义类型),不能是指针。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/22895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Threejs墙体挖洞做门或窗

在使用Threejs代码构建的展厅中&#xff0c;需要在一面墙中间挖个洞作为门或窗户&#xff0c;效果如下&#xff1a; 引入ThreeBSP.js <script src"plugins/three/ThreeBSP.js"></script> 创建 // 1 定义墙面var cubeGeometry new THREE.BoxGeometry(1…

今日代码大赏 | Spring Cloud Gateway 全局过滤器实现

在构建微服务架构时&#xff0c;Spring Cloud Gateway 作为服务网关&#xff0c;承担着路由转发、权限校验等职责。 全局过滤器&#xff08;Global Filter&#xff09;是 Spring Cloud Gateway 中用于处理跨服务的通用逻辑的组件&#xff0c;例如权限验证、日志记录等。 下面…

使用 LiteGraph.js 构建可视化工作流图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 使用 LiteGraph.js 构建可视化工作流图 应用场景介绍 LiteGraph.js 是一个轻量级的开源 JavaScript 库&#xff0c;用于构建可视化工作流图。它广泛应用于游戏开发、数据可视化、交互式叙事等领域。 代码基本…

【HarmonyOS】应用通知广播的使用

【HarmonyOS】应用通知广播的使用 一、通知广播是什么&#xff1f; 应用开发多年的同学&#xff0c;对于时间通知广播是比较熟悉。一般刚接触的同学可能不太清楚&#xff0c;下面简单介绍一下&#xff0c;了解的同学可以跨过&#xff0c;直接看第二节。 通知广播&#xff0c;…

2024会声会影激活码免费注册码大揭秘!

在当今数字化时代&#xff0c;视频编辑已经成为了许多人日常生活和工作中不可或缺的一部分。无论是制作短视频、Vlog还是专业影视剪辑&#xff0c;一款优秀的视频编辑软件都能让我们事半功倍。而市面上众多的视频编辑软件中&#xff0c;会声会影无疑是备受瞩目的一款。本文将为…

【全开源】知识库文档系统(ThinkPHP+FastAdmin)

&#x1f4da;知识库文档系统&#xff1a;解锁知识的无限可能 一款基于ThinkPHPFastAdmin开发的知识库文档系统&#xff0c;可用于企业工作流程的文档管理&#xff0c;结构化记录沉淀高价值信息&#xff0c;形成完整的知识体系&#xff0c;能够轻松提升知识的流转和传播效率&a…

短剧出海的第一桶金

经过了第一套短剧出海H5系统的不好体验的经历&#xff0c;敏锐地发现海外短剧出海系统的需求量很大。很多做国内短剧平台的企业&#xff0c;和一些创业者&#xff0c;都有搭建自己平台的想法。 反思与痛点 H5系统的痛点&#xff1a; 底层框架问题&#xff1a; 问题&#xff1…

2024.06.05【读书笔记】丨生物信息学与功能基因组学(第十一章 分子水平的系统发生和进化 第二部分)【AI测试版】

读书笔记二&#xff1a;《生物信息学与功能基因组学》第十一章第二部分 分子水平上的进化机制深入分析 在《生物信息学与功能基因组学》第十一章的第二部分中&#xff0c;作者进一步深入探讨了分子水平上的进化机制。这包括了对突变、自然选择以及物种生长影响条件的详细讨论…

收银系统源码-千呼新零售2.0【合作案例】

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货等连锁店使用。 详细介绍请查看下…

英伟达唯一指定液冷散热供应商维谛技术的股价还有巨大的上涨空间

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 在“全球AI风向标”英伟达带来的超额回报影响下&#xff0c;以及华尔街持续看好英伟达后续走势的带动下&#xff0c;美股已经掀起了一场AI“淘金热”。猛兽财经将在本文中详细介绍一下我们之前就非常看好的一家在全球AI产业…

vue的elementUI的el-tree的选择

有一棵树型的数据,需要实现:在外部加一个 全选和不全选的按钮,去全部勾选树结构里面每一项的选框。 当点击勾选全选的时候,树的每一项都勾选; 当取消全选的时候,树的每一项都不勾选; 当选树的其中一项时,全选按钮是半选状态; 实现效果如下: <template><…

动态规划——浅谈dp如何入门,以及入门题目(值得收藏,持续更新)

前言 动态规划如何入门?如果你问我怎么精通,那我只能告诉你我也不知道,但你要问我怎么入门,那我就可以和你说道说道了. 我并没有能力也不想说你看完就会了,我只是想给大家开个头,你只要知道怎么写了怎么去思考了,你就可以通过刷题来强化思维了,能走多远就看各位的造化了! 动…

Python编程学习第一篇——Python零基础快速入门(五)-列表(List)

今天我们来一起学习Python的列表&#xff08;list&#xff09;&#xff0c;Python中的列表&#xff08;List&#xff09;是一种有序、可变的数据结构&#xff0c;可以用来存储多个值。列表可以包含不同类型的数据&#xff0c;例如整数、浮点数、字符串等。以下是关于Python列表…

从头搭hadoop集群--分布式hadoop集群搭建

模板虚拟机安装配置见博文&#xff1a;https://blog.csdn.net/weixin_66158110/article/details/139236148 配置文件信息如下&#xff1a;https://pan.baidu.com/s/1074eD5aNVugEPcjwVvi9jA?pwdl1xq&#xff08;提取码&#xff1a;l1xq&#xff09; hadoop版本&#xff1a;h…

“论软件架构风格”必过范文,突击2024软考高项论文

论文真题 软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式。体系结构风格定义一个系统家族&#xff0c;即一个体系结构定义一个词汇表和一纽约束。词汇表中包含一些构件和连接件类型&#xff0c;而这组约束指出系统是如何将这些构件和连接件组合起来的。体系…

慧天卓特:东南亚基于多源遥感的干旱、土壤水分及洪灾、植被指数、火灾监测和空气质量监测分析

概述 亚洲的东南部地理位置具有特殊的意义&#xff0c;是亚洲纬度最低的地区&#xff0c;也处于亚澳之间的过渡地带&#xff0c;属热带季风气候&#xff0c;森林等自然资源丰富&#xff0c;人口稠密&#xff0c;东南亚和南亚地区面临农业生产、环境保护和经济发展的多重挑战&a…

短视频系列内容生产技能提升 沈阳短视频剪辑培训

优势&#xff1a;一、短视频系列化内容的优势 ①可持续性强 某一条视频效果很好(几十万点赞)时&#xff0c;按照相同格式继续输出非常容易成功: √不需要设计脚本&#xff1b; √不需要重新定制。 √稳定性强&#xff0c; ②节约时间成本和制作成本 举例对标账号&#xf…

随身WiFi十大热门品牌优缺点分析!哪个品牌的随身wifi更值得买?随身wifi推荐测评!

格行随身wifi 【品牌特点】&#xff1a;服务好&#xff0c;性价比高&#xff0c;随身WiFi行业的“海底捞” 【优点】&#xff1a;专注物联网行业15年&#xff0c;产品和服务双驱动&#xff0c;综合实力和客户口碑领先 【缺点】&#xff1a;产品相对聚焦&#xff0c;产品类型…

静态页面引入axios,并创建实例使用

CDN 引入 axios&#xff1a; <!DOCTYPE html> <html> <head><title>使用 axios 创建实例对象</title> </head> <body><script src"https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script><scr…

小程序中实现自定义头部导航组件

在页面中实现自定义头部导航的组件&#xff0c;如果仅是单个页面中需要自定义可在页面的json文件中配置"navigationStyle": “custom”&#xff0c;如果是项目中所有页面都想使用自定义的组件&#xff0c;可在app.json的window中全局配置"navigationStyle"…