非类型模板参数+模板的特化

news2024/11/26 20:27:25

目录

一、非类型模板参数

二、模板的特化

(一)函数模板特化

(二)类模板举例

1. 全特化

2. 偏特化


一、非类型模板参数

  • 模板参数分类:类型形参非类型形参
  • 类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。
  • 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。
  • 注意:
    1. 浮点数、类对象以及字符串是不允许作为非类型模板参数的。
    2. 非类型的模板参数必须在编译期就能确认结果。
#include<iostream>
using namespace std;
template<class T,size_t N>
class Stack
{
private:
	T _a[N];
};
int main()
{
	Stack<int, 10>s1;
	Stack<double, 1000>s2;
	cout << sizeof(s1) / sizeof(int) << endl;//10
    cout << sizeof(s2) / sizeof(double);//1000
	return 0;
}

 

二、模板的特化

  • 通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果,需要特殊处理
  • 在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。模板特化中分为函数模板特化类模板特化

(一)函数模板特化

  •  函数模板的特化步骤:
  • 1. 必须要先有一个基础的函数模板
  • 2. 关键字template后面接一对空的尖括号<>
  • 3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型
  • 4. 函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误。
// 通用模板函数
template <typename T>
bool isGreater(T a, T b) 
{
    return a > b;
}

// 特化版本针对字符类型
template <>
bool isGreater<char>(char a, char b) 
{
    cout << "Using specialized version for characters." << endl;
    return toupper(a) > toupper(b);
}
#include <iostream>
#include <cctype>
using namespace std;
// 通用模板函数
template <typename T>
bool isGreater(T a, T b) {
    return a > b;
}

// 特化版本针对字符类型
template <>
bool isGreater<char>(char a, char b) {
    cout << "Using specialized version for characters." << endl;
    return toupper(a) > toupper(b);
}

int main()
{
    if (isGreater(69, 66)) 
    {
        cout << "69 is greater than 66" << endl;
    }
    else 
    {
        cout << "69 is not greater than 66" << endl;
    }

    if (isGreater('G', 'B')) 
    {
        cout << "G is greater than B" << endl;
    }
    else
    {
        cout << "G is not greater than B" << endl;
    }
    return 0;
}

(二)类模板举例

1. 全特化

  • 全特化即是将模板参数列表中所有的参数都确定化
#include <iostream>
using namespace std;
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;
};

int main()
{
	Data<int, int> d1;
	Data<int, char> d2;
	return 0;
}

 

2. 偏特化

  • 偏特化:任何针对模版参数进一步进行条件限制设计的特化版本
  • 偏特化有以下两种表现方式:
  • 情况一部分特化:将模板参数类表中的一部分参数特化 
// 将第二个参数特化为int
template <class T1>
class Data<T1, int>
{
public:
	Data() { cout << "Data<T1, int>" << endl; }
private:
	T1 _d1;
	int _d2;
};

 

  • 情况二参数更进一步的限制:偏特化并不仅仅是指特化部分参数,而是针对模板参数更进一步的条件限制所设计出来的一个特化版本。
//两个参数偏特化为指针类型
template <typename T1, typename T2>
class Data <T1*, T2*>
{
public:
	Data() 
	{ 
		cout << "Data<T1*, T2*>" << endl; 
	}
private:
	T1 _d1;
	T2 _d2;
};
//两个参数偏特化为引用类型
template <typename T1, typename T2>
class Data <T1&, T2&>
{
public:
	Data(const T1& d1, const T2& d2)
		: _d1(d1)
		, _d2(d2)
	{
		cout << "Data<T1&, T2&>" << endl;
	}
private:
	const T1& _d1;
	const T2& _d2;
};

 

#include <iostream>
using namespace std;

template<class T1, class T2>
class Data
{
public:
    Data()
    {
        cout << "Data<T1, T2>" << endl;
    }
private:
    T1 _d1;
    T2 _d2;
};

template <typename T1, typename T2>
class Data <T1*, T2*>
{
public:
    Data()
    {
        cout << "Data<T1*, T2*>" << endl;
    }
private:
    T1* _d1;
    T2* _d2;
};

template <typename T1, typename T2>
class Data <T1&, T2&>
{
public:
    Data(const T1& d1, const T2& d2)
        : _d1(d1)
        , _d2(d2)
    {
        cout << "Data<T1&, T2&>" << endl;
    }
private:
    const T1& _d1;
    const T2& _d2;
};

int main()
{
    Data<int, char>d;
    Data<int*, int*> d1;
    Data<const int&, const int&> d2(5, 10); // 提供初始化值
    return 0;
}

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

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

相关文章

String、StringBuilder、StringBuffer区别

String、StringBuilder、StringBuffer区别 面试官&#xff1a;请你谈谈String、StringBuilder、StringBuffer区别 作为经典Java八股&#xff0c;是面试必考的热门点。 下面让我们一起来看一下他们的区别吧&#xff01; 主要是测试他们的效率和应用场景&#xff0c;具体语法不在…

苍穹外卖(六) redis缓存解决数据库压力

二节 直接用代码操作redis缓存 三, 四节 间接使用Spring Cache 注解完成redis缓存操作 可直接看三,四节 需要帮助理解注释 回去看第二节 一.问题说明 二. 实现思路 通过Redis来缓存菜品数据, 减少数据库查询操作 Redis简介 Redis是一个基于内存的key-value结构数据库。Redi…

2. vue-sy-admin: 基于vue3+TypeScript的自定义指令(directives)的封装及示例

自定义指令directives在项目特别是后台管理类的项目中使用的尤其多(个人经验)&#xff0c;每个人编写的自定义指令也各不相同&#xff0c;一个人的时候还没啥感觉&#xff0c;在多人合作的项目中统一编码规范就变得很有必要了&#xff0c;这样看着舒服的同时也更方便后期维护。…

【PyTorchTensorBoard实战】GPU与CPU的计算速度对比(附代码)

0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见解&#xff0c;但是内容可能存在不准确的地方。如果发现文中错误&#xff0c;希望批评指正&#xff0c;共同进步。 本文基于PyTorch通过tensor点积所需要的时…

【VSCode】Windows环境下,VSCode 搭建 cmake 编译环境(VSCode 插件配置)

目录 一、下载编译器 1、下载 Windows GCC 2、选择编译器路径 二、下载插件 三、配置 cmake generator 四、编译工程 一、下载编译器 1、下载 Windows GCC 这里是在Windows环境下&#xff0c;所以下载的是 Windows 环境使用的 gcc 编译器。 下载地址: MinGW-w64 - for…

【数据库系统概论】第九章关系查询处理何查询优化

9.1查询处理 一&#xff1a;查询处理步骤 关系数据库管理系统查询处理可以分为4个阶段&#xff1a; 查询分析查询检查查询优化查询执行 &#xff08;1&#xff09;查询分析 任务&#xff1a;对查询语句进行扫描&#xff0c;分析词法、语法是否符合SQL语法规则 如果没有语…

[MySQL]存储引擎、索引、SQL优化

文章目录 1. 存储引擎1.1 MySQL体系结构1.2 存储引擎简述1.3 存储引擎的特点1.3.1 innoDB1.3.2 MyISAM1.3.3 Memory1.3.4 存储引擎的选择 2. Linux下的MySQL3. 索引3.1 索引概述3.2 索引结构3.3 索引分类3.4 索引语法3.5 索引性能分析3.6 索引的使用3.6.1 索引失效3.6.2 索引使…

【LeetCode刷题(数据结构)】:给定一个链表 每个节点包含一个额外增加的随机指针 该指针可以指向链表中的任何节点或空节点 要求返回这个链表的深度拷贝

给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节点的 next…

深入探索BP神经网络【简单原理、实际应用和Python示例】

人工神经网络&#xff08;Artificial Neural Networks&#xff09;是一种受到生物神经网络启发的机器学习模型&#xff0c;它的应用范围广泛&#xff0c;包括图像识别、语音识别、自然语言处理等领域。其中&#xff0c;BP神经网络&#xff08;Backpropagation Neural Network&a…

学习笔记-MongoDB(复制集,分片集集群搭建)

复制集群搭建 基本介绍 什么是复制集&#xff1f; 复制集是由一组拥有相同数据集的MongoDB实例做组成的集群。 复制集是一个集群&#xff0c;它是2台及2台以上的服务器组成&#xff0c;以及复制集成员包括Primary主节点&#xff0c;Secondary从节点和投票节点。 复制集提供了…

花2个月时间学习,面华为测开岗要30k,面试官竟说:你不是在搞笑。。。

背景介绍 计算机专业&#xff0c;代码能力一般&#xff0c;之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发&#xff0c;第二份实习由于大三暑假回国的时间比较短&#xff08;小于两个月&#xff09;&#xff0c;于是找的实习是…

通用考勤后台管理系统

考勤后台系统&#xff0c;包括待办事项、人员管理、任务中心、任务详情、我的任务、客户管理、考勤功能几大功能&#xff0c;本后台系统以考勤打卡为主要功能&#xff0c;采用分屏布局的方式&#xff0c;简洁大方&#xff0c;使用方便

mysqlbinlog 日用记录

我是同步覆盖了两张表&#xff0c;现在想用日志恢复。 先说结论&#xff0c;没有恢复&#xff0c;因为我的日志不完整&#xff0c;设置了定时清理。 如果你truncate了表或者数据库&#xff0c;如果没有完整的日志是恢复不了数据的。 第一、mysqlbinlog 可能没开启 第二、开…

C++入门 第一篇(C++关键字, 命名空间,C++输入输出)

目录 1. C关键字 2. 命名空间 2.1 命名空间定义 2.2命名空间的使用 命名空间的使用有三种方式&#xff1a; 1.加命名空间名称及作用域限定符 2.使用using将命名空间中某个成员引入 3.使用using namespace 命名空间名称 引入 3. C输入&输出 4.缺省函数 4.1 缺省参…

微信开发者工具下载

一、微信开发者工具下载官网 微信开发者工具下载地址与更新日志 | 微信开放文档 (qq.com) 二、微信开发者工具界面 下载安装好后&#xff0c;软件图标如下图所示。 运行软件如下图所示&#xff0c;这时候就需要使用你的管理员账号扫码登录。 登陆后的界面&#xff0c;如下图…

为知笔记一个日记模板

<!DOCTYPE HTML><html><head> <meta http-equiv"Content-Type" content"text/html; charsetunicode"> <title>日记&#xff1a;</title><style id"wiz_custom_css">html, .wiz-editor-body {font-siz…

Lua调用C#类

先创建一个Main脚本作为主入口&#xff0c;挂载到摄像机上 public class Main : MonoBehaviour {// Start is called before the first frame updatevoid Start(){LuaMgr.GetInstance().Init();LuaMgr.GetInstance().DoLuaFile("Main");}// Update is called once p…

Stm32_标准库_11_ADC_光敏热敏传感器_测数值

在测量光敏传感器数值得基础上手动将通道改成热敏传感器通道即可 由于温度传感器的测量范围是-20 ~ 105摄氏度&#xff0c;所以输出温度得考虑带上符号这就需要在原有输出光照强度代码的基础上新添加几个函数 函数1&#xff1a; uint16_t AD_Getvailue(uint8_t ADC_Channel){…

C# PortraitModeFilter (人物图片)背景模糊

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Windows.Forms; us…

python文本转语音

概述 目前有文本转语音的技术&#xff0c;可以用在配音领域&#xff0c;我个人因为一些需求&#xff0c;所以开始寻找这方面的资源&#xff0c;目前各大平台&#xff0c;比如腾讯&#xff0c;讯飞&#xff0c;阿里&#xff0c;百度等都有这样的API服务&#xff0c;我个人是是使…