C++之模版的进阶

news2024/9/23 10:23:29

1.非类型模版参数

      模版参数分类类型与非类型形形参

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

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

    template<class T,size_t N = 10> 

//上面的class T即为类型形参,而size_t N = 10即为非类型形参

注意:

    1.浮点数,类对象及字符串是不允许作为非类型模版参数的。

    2.非类型的模版参数必须在编译器就能确认结果。 

2.模版的特化

   2.1概念

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

下面为需要特殊化处理的例子:

template<class T>

bool less(T left,T right)

{

    return left < right;

}

int main()

{

  Date d1(2022,7,7);

  Date d2(2022,7,8);

Date* p1 = &d1;

Date*p2  = &d2

  cout << Less(p1,p2) << endl; //结果错误

return 0;

}

上述的Less可以比较,但结果是错误的,这是因为Less内部并没有比较p1和p2指向的内容而只比较了p1和p2指针的地址。

在这种情况下,就需要对模版进行特化。模版的特化也分为:函数模版特化与类模版特化 

2.2 函数模版特化

函数模版的特化步骤:

1.必须先有一个基础的函数模版、

2.关键字template后面接一对空的尖括号 <>

3.函数名后面跟一对尖括号,尖括号中指定需要特化的类型。

4.函数形参表:必须要和模版函数的基础参数类型完全相同

template<class T>

bool Less(T left, T right)

{
    return left < right;

}

  //以下就是对less模版进行特化

template<>

bool Less<Date*>(Date* left,Date* right)

{

   return*left <*right;

}

int main()

int main()

{

  Date d1(2022,7,7);

  Date d2(2022,7,8);

 Date* p1 = &d1;

 Date*p2  = &d2

  cout << Less(p1,p2) << endl; //调用特化之后的版本

return 0;

}

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

bool Less(Date* left,Date* right)

{

   return *left < *right;

}

这种实现简单明了,可读性更高,所以不建议函数模版特化。

2.3 类模版特化 

  2.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;
};
void TestVector()
{
  Data<int, int> d1;
  Data<int, char> d2;
}

   2.3.2 偏特化

偏特化:任何针对模版参数进一步进行条件限制设计的特化版本

偏特化有以下两种表现方式:

1.部分特化 

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

template<class T1>

class Date<T1,int>

{

 public:

               Date(){cout <<"Data<T1, int>'' <<endl;}

private:

               T1_d1;

               int_d2;

};

2.参数更进一步的限制 

偏特化不仅仅是指特化部分参数,而是针对模版参数更进一步的特化版本

例如两个参数偏特化为指针类型:

template<typename T1,typename T2>

class Data<T1*,T2*>

{

public:

      Data()

      {cout << "Data<T1*,T2*>" <<endl;}

private:

     T1_d1;

     T2_d2;

};

3.模版分离编译 

   3.1 什么是分离编译

一个程序由若干个源文件共同实现,而每一个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。

  3.2 模版的分离编译

4.模版总结 

【优点】

1.增强了代码的灵活性

2.模版复用了代码,节省资源

【缺陷】

1.模版会导致代码膨胀问题

2.出现模版错误时,错误原因难以定位

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

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

相关文章

股指期货交割方式是什么?

说起股指期货&#xff0c;这可是个高大上的金融玩意儿。咱们平时买卖股票&#xff0c;那是看准了哪只股就下手&#xff0c;赚了就卖&#xff0c;赔了就扛&#xff0c;挺直接的。但股指期货呢&#xff0c;它玩的是未来的预期&#xff0c;就像是你跟人打赌明天天气好不好&#xf…

Fyne ( go跨平台GUI )中文文档-Fyne总览(二)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2​​​​​​​ 这是一个系列文章&#xff1a; Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne…

《python语言程序设计》2018版第8章18题几何circle2D类(中部)

第一、重新分析 第一-1、我设计的第一模式第一-1-1、遇到的逻辑分析迷雾第一-1-2、无畏挣扎后的无奈 第二-1、我就把你们两个放到一起,第二-2、我的想法 当我看到了这个2个园并且比对. 第一-1、我设计的第一模式 设计一个最抽象的Circle2D类. 这个类只包含一个x,y和circle 这个…

Parallels Desktop 20 for Mac 推出:完美兼容 macOS Sequoia 与 Win11 24H2

Parallels Desktop 20 for Mac 近日正式发布&#xff0c;这一新版本不仅全面支持 macOS Sequoia 和 Windows 11 24H2&#xff0c;还在企业版中引入了一个全新的管理门户。新版本针对 Windows、macOS 和 Linux 虚拟机进行了多项改进&#xff0c;其中最引人注目的当属 Parallels …

让模型评估模型:构建双代理RAG评估系统的步骤解析

在当前大语言模型(LLM)应用开发的背景下,一个关键问题是如何评估模型输出的准确性。我们需要确定哪些评估指标能够有效衡量提示(prompt)的效果,以及在多大程度上需要对提示进行优化。 为解决这一问题,我们将介绍一个基于双代理的RAG(检索增强生成)评估系统。该系统使用生成代理…

免费开源的AI 智能网盘,图片和媒体管理工具 | 极空间部署『PicHome』

免费开源的AI 智能网盘&#xff0c;图片和媒体管理工具 | 极空间部署『PicHome』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 想必很多小伙伴儿手机&#xff0c;电脑&#xff0c;甚至是网盘上都存取了大量的各类图片&#xff0c;不知道大家都是怎么管理你手头大量的图片的&…

食探秘:Spring Boot校园周边美食发现平台

第三章 系统设计 3.1 系统概要设计 本校园周边美食探索及分享平台选择B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式。适合在互联网上进行操作&#xff0c;只要用户能连网&#xff0c;任何时间、任何地点都可以进行系统的操作使用。系统工作原理图如图3-1所…

PMP--二模--解题--71-80

文章目录 13.干系人管理--干系人登记册--记录干系人的身份信息、评估信息、干系人分类。识别完干系人更新干系人登记册。71、 [单选] 一名初级项目经理被指派到一个新启动的项目&#xff0c;高级项目经理指示该初级项目经理去识别在项目中享有既得利益的人员。高级项目经理让初…

上半年营收净利双降,债台高筑下扩产能,天合光能“激进”前行?

近年来&#xff0c;随着新能源产业的蓬勃兴起&#xff0c;以及消费端对低碳经济追求的日益增强&#xff0c;再叠加分布式光伏发电系统的快速发展&#xff0c;全球市场对光伏组件的需求量愈发高涨。 而我国目前又是全球最大的光伏组件生产国和出口国&#xff0c;这离不开隆基绿…

桶排序和计数排序(非比较排序算法)

桶排序 桶排序是一种基于分配的排序算法&#xff0c;特别适合用来排序均匀分布的数据。它的基本思想是将输入的数据分到有限数量的桶里&#xff0c;然后对每个桶内的数据分别进行排序&#xff0c;最后再将各个桶内的数据合并得到最终的排序结果。(通常用于浮点数&#xff0c;因…

LLM大模型训练/推理的显卡内存需求计算

无论你是从头开始训练 LLM、对其进行微调还是部署现有模型&#xff0c;选择合适的 GPU 对成本和效率都至关重要。在这篇博客中&#xff0c;我们将详细介绍使用单个和多个 GPU 以及不同的优化器和批处理大小进行 LLM 训练和推理时 GPU 要求的所有信息。 计算机处理器由多个决定…

SM2无证书及隐式证书公钥机制签名和加密过程详解(一)

前面介绍SM2无证书及隐式证书公钥机制下用户公私密钥对的Python实现&#xff08;具体参看SM2隐式证书用户公私钥生成python代码实现_sm2 python 密钥生成-CSDN博客&#xff09;&#xff0c;可以看到需由用户和KGC&#xff08;可信密钥生成中心&#xff09;共同参与才能计算得到…

小程序-基础知识1

Mustache语法 小程序和vue一样提供了插值语法 但是小程序不能调用方法{{xxxx()}} hidden属性 hidden是所有组件都默认拥有的属性&#xff0c; hidden与wx:if的区别&#xff1a; wx:if是控制组件是否渲染,hidden控制显示或隐藏是通过添加hidden属性。 wx:for 除了可以遍历…

服务器配置虚拟环境及离线安装python

本篇文章基于已经装好conda环境进行哈&#xff0c;不会安装conda可参考服务器离线安装anaconda-CSDN博客 1.打印现有虚拟环境列表 conda env list&#xff0c;可以看见我现在有base、ai、py38三个环境 2.删除指定虚拟环境 conda remove -n py38 --all&#xff0c;回车后输入ye…

LeetCode 面试经典150题 190.颠倒二进制位

复习知识&#xff1a;正数的原码、反码、补码相同&#xff0c;负数的反码在其原码的基础上, 符号位不变&#xff0c;其余各个位取反&#xff0c;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后1 (即在反码的基础上1)。 题目&#xff1a;颠倒给定的 32 位无符号…

全国及分(31个)省全社会就业人数(1978-2022年)

分省就业人数分析 经济发达省份&#xff1a;如广东、江苏、浙江等省份的就业人数较高&#xff0c;这与它们的经济发展水平和产业结构密切相关。欠发达省份&#xff1a;虽然就业人数相对较低&#xff0c;但也呈现出增长态势&#xff0c;显示了国家在区域协调发展上的成效。 从…

软考高级:数据库事务状态区分:活动、部分提交、提交、失败、中止 AI 解读

讲解 数据库事务状态的区分可以用来表示事务在不同阶段的状态。事务&#xff08;Transaction&#xff09;是数据库中的一组操作&#xff0c;要么全部成功&#xff0c;要么全部失败。这些状态可以帮助我们理解事务从开始到结束的整个生命周期。 生活化例子 假设你去餐厅点餐&…

AI资深导师指导-ChatGPT深度科研工作应用、论文撰写、数据分析及机器学习与AI绘图

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年4月&#xff0c;更强版本的ChatGPT4.0上线&#xff0c;文本、语音、图像等多模态交互方式使其在…

操作系统week3

操作系统学习 三.内存管理 16.内存映射文件 传统的文件访问方式&#xff1a; open系统调用–打开文件seek系统调用–将读写指针移到某个位置read系统调用–从读写指针所指位置读入若干数据write系统调用–将内存中的指定数据&#xff0c;写回磁盘 内存映射文件的访问方式&…

2.pytest框架实现一些前后置(固件,夹具)的处理,断言和allure-pytest插件生成allure测试报告

一、setup/teardowm,setup_class/teardown_class&#xff08;所有&#xff09; 为什么需要这些功能&#xff1f; 比如&#xff1a;web自动化执行用例之前&#xff0c;请问需要打开浏览器吗&#xff1f;用例执行后需要关闭浏览器吗&#xff1f; 前置后置 二、使用pytest.fixture…