C++10:非类型模板参数以及模板的特化

news2024/9/25 19:16:54

目录

非类型模板参数

模板的特化

模板类的特化

 1.全特化

2.偏特化


模板其实还有其他的玩法,比如非类型模板参数以及模板的特化。

非类型模板参数

在记述非类型模板参数前,我们认识一下C++中一个比较鸡肋的类,array

#include<iostream>
#include<array>
using namespace std;

int main()
{
    array<int, 10>a1;

    cout << a1[5] << endl;
}

  • 相较于C语言宽松的数组越界检查,array则可以直接在越界访问时报错。但用习惯了原生数组,换成用这个格式繁琐的数组,有点得不偿失,毕竟越界还是跟我们写逻辑的人有关。
  • 但是这个东西里面的显示实例化里头有一项比较惹人注意,这个是什么?

 这个就是非类型模板参数了,不同于我们之前使用的模板参数只能传递类型,在这里,它允许我们传递一个整型。

namespace bite
{
    // 定义一个模板类型的静态数组
    template<class T, size_t N = 10>
    class array
    {

    public:
        T& operator[](size_t index) { return _array[index]; }    

        const T& operator[](size_t index)const { return _array[index]; }
        size_t size()const { return _size; }
        bool empty()const { return 0 == _size; }
    private:
        T _array[N];
        size_t _size;
    };
}
  • 反正就是定义了一个模板参数,但是这个模板参数并不是泛型,而是指定类型,在当前的这个模板下,我们可以把这个非类型模板参数当成正常的参数使用。
  • 但是这个非类型模板参数只适合整型常量,什么意思呢?

一个非类型模板参数,它不能接收除了整型之外的类型,不然就报错,而且必须是常量,变量也不行。

 型变量主要还是应对需要传递整型参数来控制值的情况,还是有用的。

模板的特化

  • 有时候我们希望我们写下的泛型代码在某些特殊的情况下能特殊处理。
  • 说明白一点就是传入什么东西就照着对应的方法进行处理,好比一家洗衣店,普通的衣物直接水洗,特殊的衣物换成干洗。
  • 套用至代码范畴,我们希望传递参数的时候传入变量的时候对比其大小,传入指针时解引用再比较。
  • 大体情况来形容就是特殊通道,比如高铁站的特殊人群快速通道
template <class T>
bool Little (const T& x, const T& y)
{
    return x < y;
}

int main()
{
    //传整型
    int a = 10, b = 20;
    cout << Little(a, b) << endl;

    //传地址
    int* pa = &a, * pb = &b;
    cout << Little(pa, pb) << endl;

}

  •  在这种情况下我们的函数模只是比对了两个地址的大小,而我们的本意希望他可以比较地址指向的值的大小,这个时候我们就可以用模板特化来让这个模板函数如我们所愿。
template <class T>
bool Little ( T x, T y)
{
    return x < y;
}

//模板特化
template <>
bool Little<int*>( int* x, int*  y)
{
    return *x < *y;
}

但是想要成功特化,传递参数的修饰符需要是一样的,比如说我的原生函数模板用的是引用接收传参,那么我的特化也是要变成引用

 当然由于C++支持函数重载,换成重载方式去写也是完全没问题的。

 但毕竟只有函数能重载,要是类模板的话就不行了,类只能乖乖的用特化来实现。

模板类的特化

 1.全特化

template<class T1, class T2>
class Text
{
public:
	Text()
	{
		cout << "使用的是<int , int>类型" << endl;
	}
private:
	T1 _data1;
	T2 _data2;

};

//全特化
template<>
class Text<double, double>
{
public:
	Text()
	{
		cout << "使用的是<double , double>类型" << endl;
	}
private:
	double _data1;
	double _data2;

};

2.偏特化

//偏特化
template<class T>
class Text<T, double>
{
public:
	Text()
	{
		cout << "使用的是<T , double>类型" << endl;
	}
private:
	T _data1;
	double _data2;

};

 以上就是大致的特化使用举例描述了。

 当笔记用

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

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

相关文章

Kotlin1.8新特性

Kotlin1.8.0新特性 新特性概述 JVM 的新实验性功能&#xff1a;递归复制或删除目录内容提升了 kotlin-reflect 性能新的 -Xdebug 编译器选项&#xff0c;提供更出色的调试体验kotlin-stdlib-jdk7 与 kotlin-stdlib-jdk8 合并为 kotlin-stdlib提升了 Objective-C/Swift 互操作…

MATLAB绘制泰勒图(Taylor diagram)

泰勒图&#xff08;Taylor diagram&#xff09; 泰勒图是Karl E. Taylor于2001年首先提出&#xff0c;主要用来比较几个气象模式模拟的能力&#xff0c;因此该表示方法在气象领域使用最多&#xff0c;但是在其他自然科学领域也有一定的应用。 泰勒图常用于评价模型的精度&…

使用命令别名一键启动arthas

1. 使用命令别名启动arthas 确保单板上有jdk和arthas jdk目录&#xff1a;/home/xinliushijian/arthas/jdk arthas目录&#xff1b;/home/xinliushijian/arthas su xinliushijian编写脚本messi.sh cd /home/xinliushijian/arthas vi messi.sh 内容如下&#xff1a; #!/bin/ba…

「兔了个兔」玉兔踏青,纯CSS实现瑞兔日历(附源码)

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

Hive中数据库和表的操作(HSQL)

数仓管理工具Hive可以将HDFS文件中的结构化数据映射成表&#xff0c; 利用HSQL对表进行分析&#xff0c;HSQL的底层运行机制&#xff0c;默认是MapReduce计算&#xff0c;也可以替换成Spark、Tez、Flink 计算结果存储在HDFS&#xff0c;像Hive中的库、表、字段、表所属库、表的…

Zebec社区上线ZIP-2(地平线升级行动)提案

此前&#xff0c;Zebec社区在上线了投票治理系统Zebec Node后&#xff0c;曾上线了首个提案ZIP-1&#xff0c;对Nautilus Chain的推出进行了投票&#xff0c;作为Zebec Chain上线前的“先行链”&#xff0c;该链得到了社区用户的欢迎&#xff0c;投通过票的比例高达98.3%。而Na…

[Java代码审计]—命令执行失效问题

前言 关于Java的命令执行其实一直都没有单独学习过&#xff0c;正好昨天师傅问了一个问题&#xff1a;命令执行时字符串和字符串数组用哪个更好一些。当时被问得有点懵难道不都一样么&#xff1f;其实不然&#xff0c;借此重新了解下RCE以及失效问题。 单例模式 常规命令执行…

基于STM32 电机库(5.4.4)的单电阻采样调试总结

目录 硬件调整 软件调整 下载运行 参数优化 总结 硬件调整 实验用的开发板和电机如下&#xff0c;在调单一电阻之前已经在三电阻的环境下把启动运行的参数已经调好了&#xff0c;这里不多说。调好后需要把硬件改成单电阻采样。 如下原理图&#xff1a; 只需要把R75,76两…

每个人都应该知道的5个NLP代码库

在本文中&#xff0c;将详细介绍目前常用的Python NLP库。内容译自网络。这些软件包可处理多种NLP任务&#xff0c;例如词性&#xff08;POS&#xff09;标注&#xff0c;依存分析&#xff0c;文档分类&#xff0c;主题建模等等。NLP库的基本目标是简化文本预处理。目前有许多工…

【6】linux命令每日分享——rm删除目录和文件

大家好&#xff0c;这里是sdust-vrlab&#xff0c;Linux是一种免费使用和自由传播的类UNIX操作系统&#xff0c;Linux的基本思想有两点&#xff1a;一切都是文件&#xff1b;每个文件都有确定的用途&#xff1b;linux涉及到IT行业的方方面面&#xff0c;在我们日常的学习中&…

loki 日志管理的安装部署使用

loki介绍 Loki是 Grafana Labs 团队最新的开源项目&#xff0c;是一个水平可扩展&#xff0c;高可用性&#xff0c;多租户的日志聚合系统。它的设计非常经济高效且易于操作&#xff0c;因为它不会为日志内容编制索引&#xff0c;而是为每个日志流编制一组标签。 不对日志进行…

python学习之手把手教你将图片变成黑白或彩色字符画(骚操作)

文章目录前言一、字符画的实现原理二、黑白字符画实现代码三、彩色字符画生成代码实现&#xff1a;总结前言 字符画这个话题&#xff0c;似乎早在贴吧时代就已经被玩烂了。在百度图片随便一搜索&#xff0c;就能够看到非常多。然后在这个时代&#xff0c;会编程的人越来越多&a…

Transformer输出张量的值全部相同?!

【bug】Transformer输出张量的值全部相同&#xff1f;&#xff01;现象原因解决现象 输入经过TransformerEncoderLayer之后&#xff0c;基本所有输出都相同了。 核心代码如下&#xff0c; from torch.nn import TransformerEncoderLayer self.trans TransformerEncoderLayer…

日记本-课后程序(JAVA基础案例教程-黑马程序员编著-第七章-课后作业)

【实验7-3】 日记本 【任务介绍】 1.任务描述 编写一个日记本功能的程序&#xff0c;使用字节流经日记的具体信息记录在本地的txt文件中。当用户输入日记的特定内容后&#xff0c;会将输入的内容保存至本地的txt文件中。需要输入的内容包括“姓名”&#xff0c;“天气”、“…

OpenFeign详解

OpenFeign是什么&#xff1f; OpenFeign&#xff1a; OpenFeign是Spring Cloud 在Feign的基础上支持了SpringMVC的注解&#xff0c;如RequesMapping等等。OpenFeign的FeignClient可以解析SpringMVC的RequestMapping注解下的接口&#xff0c;并通过动态代理的方式产生实现类&am…

基于YOLOv5的细胞检测实战

数据及代码链接见文末 1.任务与数据集介绍 如下图所示,我们有一个医学细胞数据集,需要从数据集中检测出三种不同的细胞。标签中已经标注了细胞的类别和位置。 我们也可以看到,三种细胞有着不同的形态和颜色,同时数据集的标签也存在没有标注到的细胞 2.数据与标签配置方…

【打卡-Coggle竞赛学习2023年2月】图节点嵌入

文章目录## Part4 图节点嵌入### 背景介绍### 环境配置### 学习打卡- 任务1&#xff1a;图属性与图构造- 任务2&#xff1a;图查询与遍历- 任务3&#xff1a;节点中心性与应用- 任务4&#xff1a;图节点嵌入算法&#xff1a;- 任务5&#xff1a;图节点嵌入算法&#xff1a;- 任…

PowerAutomation获取邮件附件并删除这个邮件方法

这个文章是怎么来的呢&#xff1f;现在不是低代码开发平台启蒙阶段嘛&#xff1f;笔者也有幸在工作中进行了尝试&#xff0c;目前也已经在实际工作中结合Python进行了使用&#xff0c;当然&#xff0c;是可以提高IT的工作效率的。需求是这样的&#xff0c;想从公司的EBS平台报表…

3.5 实战:Spring Boot 实现系统多环境配置

第3章 Spring Boot 的系统配置 3.1 Spring Boot 系统配置文件 3.2 Spring Boot 自定义配置项 3.3 Spring Boot 其他配置 3.4 Spring Boot 日志配置 3.5 实战&#xff1a;Spring Boot 实现系统多环境配置 3.5 实战&#xff1a;Spring Boot 实现系统多环境配置 在实际项目开发的…

python的所有知识点(含讲解),不看就亏死了

目录 简介 特点 搭建开发环境 版本 hello world 注释 文件类型 变量 常量 数据类型 运算符和表达式 控制语句 数组相关 函数相关 字符串相关 文件处理 对象和类&#xff0c;注&#xff1a;不是那个对象&#xff01;&#xff01;&#xff01;&#xff01;&…