(类)偏特化Partial Specialization

当编写一个模板特化,涉及部分但不是全部模板参数时,它被称为偏特化(Partial Specialization)。【注意,偏特化是针对类模板而言,函数模板不可偏特化,只能全特化】
偏特化是C++模板编程中的一种技术,允许为特定类型或特定类型组合的模板参数创建专门的模板定义。这使得可以根据模板参数的特定属性或组合来定制模板的行为,从而提供更灵活和定制化的解决方案。

在偏特化中,可以保留模板参数中的一部分,而将另一部分替换为特定的类型或模式。这使得可以为不同的参数提供不同的实现,以满足特定的需求或条件。

偏特化在处理复杂的模板类型时特别有用,例如嵌套模板或带有多个模板参数的模板。通过偏特化可以根据具体情况对模板进行定制,而无需完全重新实现整个模板。

总的来说,偏特化是C++模板编程中的一项重要技术,允许根据特定的模板参数定制模板的行为,从而提供更灵活和高效的解决方案。

开始偏特化时,使用一个模板头列出没有特化的模板参数,然后定义特化。与完全特化一样,通过列出所有模板参数来命名要特化的类。一些模板参数取决于特化的参数,而另一些则使用特定值。

与完全特化一样,特化的定义完全替换了特定一组模板参数的主模板。按照惯例,保持相同的接口,但实际的实现不要求与原始模板一致。

偏特化示例:

#include <iostream>
#include <vector>/* 1. 原始模板 */
template<class T, class U>
class Rational{
public:// Delegating ConstructorRational(): Rational(0){std::cout << __PRETTY_FUNCTION__ << std::endl;}Rational(T num): numerator_(num), denominator_(1){std::cout << __PRETTY_FUNCTION__ << std::endl;}Rational(T num, U den): numerator_(num), denominator_(den){std::cout << __PRETTY_FUNCTION__ << std::endl;}virtual ~Rational(){std::cout << __PRETTY_FUNCTION__ << std::endl;}T numerator()const{return numerator_;}U denominator()const{return denominator_;}template<class V>V calculate();private:T numerator_;U denominator_;
};template<class T, class U>
template<class V>
V Rational<T,U>::calculate(){return static_cast<V>(numerator_) / static_cast<V>(denominator_);  // omit divided by zero
}/* 2. Partial Specialization,特化U为float */
template<class T>
class Rational<T, float>{
public:// Delegating ConstructorRational(): Rational(0){std::cout << __PRETTY_FUNCTION__ << std::endl;}Rational(T num): numerator_(num), denominator_(1){std::cout << __PRETTY_FUNCTION__ << std::endl;}Rational(T num, T den): numerator_(num), denominator_(den){std::cout << __PRETTY_FUNCTION__ << std::endl;}virtual ~Rational(){std::cout << __PRETTY_FUNCTION__ << std::endl;}T numerator()const{return numerator_;}float denominator()const{return denominator_;}template<class V>V calculate();private:T numerator_;float denominator_;
};template<class T>
template<class V>
V Rational<T,float>::calculate(){return static_cast<V>(numerator_) / static_cast<V>(denominator_);  // omit divided by zero
}/* 3. Partial Specialization,特化T为float */
template<class U>
class Rational<float,U>{
public:// Delegating ConstructorRational(): Rational(0){std::cout << __PRETTY_FUNCTION__ << std::endl;}Rational(float num): numerator_(num), denominator_(1){std::cout << __PRETTY_FUNCTION__ << std::endl;}Rational(float num, U den): numerator_(num), denominator_(den){std::cout << __PRETTY_FUNCTION__ << std::endl;}virtual ~Rational(){std::cout << __PRETTY_FUNCTION__ << std::endl;}float numerator()const{return numerator_;}U denominator()const{return denominator_;}template<class V>V calculate();private:float numerator_;U denominator_;
};template<class U>
template<class V>
V Rational<float,U>::calculate(){return static_cast<V>(numerator_) / static_cast<V>(denominator_);  // omit divided by zero
}int main() {Rational<float,int> r1;Rational<int,float> r2;Rational<int,int> r3;Rational<double,double> r4;//Rational<float,float> r5;  // 此句报错error: ambiguous template instantiation for 'class Rational<float, float>'
}

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

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

相关文章

FPGA ov5640视频以太网传输

1 实验任务 使用DFZU4EV MPSoC 开发板及双目OV5640摄像头其中一个摄像头实现图像采集&#xff0c;并通过开发板上的以太网接口发送给上位机实时显示。 2 Verilog代码 2.1 顶层模块 timescale 1ns / 1ps //以太网传输视频顶层模块module ov5640_udp_pc (input sys_cl…

[C++初阶]string的几道oj题

1.LCR 192. 把字符串转换成整数 (atoi) 这题难度不大,我这里采取遍历跳过空格的方式&#xff0c;我先展示出我的代码,然后慢慢讲解: class Solution { public:int myAtoi(string str) {if (str.empty()) return 0;int lengthstr.size();int i0;int symbol1;int sum0;while(i&l…

春游江淮 请来池州|一起看看石台这条“天路”有多美

自驾石台天路 石台天路位于安徽省石台县,西起杜村蓬莱仙洞,东起七都镇,全程约65公里,其中核心路段海拔均在650米以上,最高处海拔坐标位置901米,自驾其中,一路穿越山乡秘境,丛林、山脉、古村、古桥、流水、人家……扑面而来。 沿着蜿蜒的山路前行,一路上的风景如诗如画,青山如黛…

Java中ArrayList、LinkedList与Vector的区别

ArrayList ArrayList是一个可以改变大小的数组&#xff0c;当更多的元素加入到ArrayList中时&#xff0c;其大小将会动态的增长&#xff0c;内部的元素可以直接通过get与set方法进行访问&#xff0c;因为ArrayList本质上就是一个数组。 LinkedList LinkedList是一个双向链表…

IT项目管理 选择/判断 【太原理工大学】

第一章、IT项目管理 判断题 1、搬家属于项目。&#xff08; 对 &#xff09; 2、项目是为了创造一个唯一的产品或提供一个唯一的服务而进行的永久性的努力。&#xff08; 错 &#xff09; 3、项目具有临时性的特征。&#xff08; 对 &#xff09; 4、项目开发过程…

你的计算机配置似乎是正确的,但该设备或资源DNS没有响应

方法/步骤 方法一&#xff1a; 快捷键“winr”,输入services.msc&#xff0c;进入服务界面&#xff0c;找到dnsclient&#xff0c;确保是运行状态&#xff0c;如果没有运行&#xff0c;则选中该条目&#xff0c;右键选择运行。 电脑提示“您的计算机配置似乎是正确”&#xf…

长难句打卡5.6

For H&M to offer a $5.95 knit miniskirt in all its 2,300-plus stores around the world, it must rely on low-wage overseas labor, order in volumes that strain natural resources, and use massive amounts of harmful chemicals. 翻译:H&M若要在其全球总共2…

数据库中视图的知识点

视图&#xff08;子查询&#xff09;&#xff1a;是从一个或多个表导出的虚拟的表&#xff0c;其内容由查询定义。具有普通表的结构&#xff0c;但是不实现数据存储。对视图的修改&#xff1a;单表视图一般用于查询和修改&#xff0c;会改变基本表的数据&#xff0c;多表视图一…

WordPress如何判断当前页是否属于文章页或页面?

我想在WordPress站点的文章页和页面中输出一些内容&#xff0c;其他页面不输出&#xff0c;那么我应该怎么判断当前页是否为文章页或页面呢&#xff1f;下面boke112百科就跟大家简单介绍一下。 估计很多WordPress站点都知道以下两个判断函数&#xff1a; 1、如果当前页是文章…

.Net MAUI 搭建Android 开发环境

一、 安装最新版本 VS 2022 安装时候选择上 .Net MAUI 跨平台开发 二、安装成功后,创建 .Net MAUI 应用 三、使用 VS 自带的 Android SDK 下载 ,Android镜像、编译工具、加速工具 四、使用Vs 自带的 Android Avd 创建虚拟机 五、使用 Android 手机真机调试

【PyTorch】6-可视化(网络结构可视化、CNN可视化、TensorBoard、wandb)

PyTorch&#xff1a;6-可视化 注&#xff1a;所有资料来源且归属于thorough-pytorch(https://datawhalechina.github.io/thorough-pytorch/)&#xff0c;下文仅为学习记录 6.1&#xff1a;可视化网络结构 Keras中可以调用model.summary()的API进行模型参数可视化 torchinfo…

【软考高项】三十五、资源管理基础内容

一、管理基础 项目资源管理包括识别、获取和管理所需资源以成功完成项目的各个过程&#xff0c;包括实物资源和团队资源。项目资源管理是为了降低项目成本&#xff0c;而对项目所需的人力、材料、机械、技术、资金等资源所进行的计划、组织、指挥、协调和控制等的活动。项目团…

Milvus Cloud 的RAG 的广泛应用及其独特优势

一个典型的 RAG 框架可以分为检索器(Retriever)和生成器(Generator)两块,检索过程包括为数据(如 Documents)做切分、嵌入向量(Embedding)、并构建索引(Chunks Vectors),再通过向量检索以召回相关结果,而生成过程则是利用基于检索结果(Context)增强的 Prompt 来激…

C表示interp2基本功能

在MATLAB中&#xff0c;interp2函数用于二维插值。当使用nearest选项时&#xff0c;它会执行最近邻插值。以下是如何在MATLAB中使用nearest选项的示例&#xff1a; % 假设X和Y是已知点的网格&#xff0c;V是这些点上已知的函数值 X 1:0.5:3; % X坐标的网格 Y 1:0.5:3; %…

ROS研究-初步

目录 1.ROS安装简述1.ROS版本选择2.添加源3.添加ros公钥4.设置环境5.构建包的依赖关系6.初始化rosdep7.小乌龟验证00.卸载ros2.ros安装目录说明3.检查脚本配置环境1.ROS安装简述 安装步骤可参考官网:ROS官网 ROS Notic的Ubuntu安装 1.ROS版本选择 2.添加源

Web API之DOM

DOM 一.认识DOM二.获取元素三.事件基础四.操作元素(1).改变元素内容(2).修改元素属性(str、herf、id、alt、title&#xff09;(3).修改表单属性(4).修改样式属性操作(5).小结 五.一些思想(1).排他思想(2).自定义属性的操作 六.节点操作1.认识2.节点层级关系3.创建和添加、删除、…

el-checkbox 无法动态设置勾选状态

问题 cheked 值动态变化&#xff0c;但是勾选状态无法动态改变 解决 v-model 与:checked 同时使用 <el-checkbox class"add-shop-check" v-model"renderData[0].isCheck" :checked"renderData[0].isCheck" change"checked > selec…

3.处理数据

处理数据 写在前面1.变量整型char类型bool类型浮点型类型分类 2.算术运算符除模 3.类型转换总结 写在前面 关于看书。其实我已经很久没看过书了&#xff0c;最近一次长时间看书还要追述到大学的时候&#xff0c;那时候上面都没有&#xff0c;就是有时间。原本我其实很爱看书的…

leetcode91.解码方法(动态规划)

问题描述&#xff1a; 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; A -> "1" B -> "2" ... Z -> "26" 要 解码 已编码的消息&#xff0c;所有数字必须基于上述映射的方法&#xff0c;反向映射回字母&#xff08;可…

HFSS学习-day2-T形波导的优化设计

入门实例–T形波导的内场分析和优化设计 HFSS--此实例优化设计 优化设计要求1. 定义输出变量Power31、Power21、和Power11&#xff0c;表示Port3、Port2、Port1的输出功率2.参数扫描分析添加扫描变量和输出变量进行一个小设置添加输出变量进行扫描分析 3. 优化设计&#xff0c…