(类)偏特化Partial Specialization

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

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

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

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

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

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

偏特化示例:

#include <iostream>
#include <vector>

/* 1. 原始模板 */
template<class T, class U>
class Rational{
public:
    // Delegating Constructor
    Rational(): 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 Constructor
    Rational(): 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 Constructor
    Rational(): 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.mfbz.cn/a/604188.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多线程【阻塞队列】(生产者消费者模型代码实现)

阻塞队列 解耦合削峰填谷生产者消费者模型&#xff1a; 解耦合 削峰填谷 生产者消费者模型&#xff1a; 正常来说&#xff0c;wait通过notify唤醒&#xff0c;其他线程调用了take,在take的最后一步进行notify. package thread; class MyBlockingQueue{private String [] data…

OpenCV 入门(二)—— 车牌定位

OpenCV 入门系列&#xff1a; OpenCV 入门&#xff08;一&#xff09;—— OpenCV 基础 OpenCV 入门&#xff08;二&#xff09;—— 车牌定位 OpenCV 入门&#xff08;三&#xff09;—— 车牌筛选 OpenCV 入门&#xff08;四&#xff09;—— 车牌号识别 OpenCV 入门&#xf…

存储虚拟化概述

目录 1. 存储体系架构 2. 存储设备层虚拟化 3. 块聚合层虚拟化 3.1. 块聚合层虚拟化实现方式 3.2. 块聚合层虚拟化分类 3.3. 块聚合层虚拟化技术 4. 文件/记录层的存储虚拟化 存储虚拟化是一种将存储系统的内部功能从应用、主机或者网络资源中抽象、隐藏或者隔离的技术&…

事业单位向媒体投稿发文章上级领导交给了我投稿方法

作为一名事业单位的普通职员,负责信息宣传工作,我见证了从传统投稿方式到智能化转型的全过程,这段旅程既是一次挑战,也是一次宝贵的成长。回想起初涉此领域的日子,那些通过邮箱投稿的时光,至今仍然历历在目,其中的酸甜苦辣,构成了我职业生涯中一段难忘的经历。 邮箱投稿:费时费…

06-beanFactoryPostProcessor的执行

文章目录 invokeBeanFactoryPostProcessors(beanFactory)invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors())invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);invokeBeanFactoryPostProcessors(regularPostProc…

JAVA基础之jsp标准标签

jsp动作标签实现实例化一个实体类 <jsp:useBean id"标识符" class"java类名" scope"作用范围"> 传统的java方式实例化一个实体类 Users user new Users(); <%%> id: 对象名 * class:类 创建对象时,完全限定名(包名…

设置默认表空间和重命名

目录 设置默认表空间 创建的临时表空间 tspace4 修改为默认临时表空间 创建的永久性表空间 tspace3 修改为默认永久表空间 重命名表空间 将表空间 tspace3 修改为 tspace3_1 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/13520…

Spring Boot | Spring Boot 整合 “RabbitMQ“ ( 消息中间件 ) 实现

目录: Spring Boot 整合 "RabbitMQ" ( 消息中间件 )实现 &#xff1a;一、Spring Boot 整合 整合实现 : Publish/Subscribe ( 发布订阅 ) 工作模式 ( "3种"整合实现方式 )1.1 基于"API"的方式 ( 实现 Publish/Subscribe "发布订阅"工作…

OSPF Stub区域

原理概述 OSPF 协议定义了多种区域&#xff08; Area &#xff09;类型&#xff0c;其中比较常见的有 Stub 区域和 Totally Stub 区域。区域的类型决定了在这个区域当中所存在的 LSA 的类型。 Stub 区域不允许 Type-4和 Type-5 LSA 进入&#xff0c;该区域会通过 Type-3 LSA…

电子商务对应的职业有哪些?10年互联网人透底行业秘密!

电子商务对应的职业有哪些&#xff1f;10年互联网人透底行业秘密&#xff01; 事实说话&#xff0c;实事求是&#xff0c;不要再把美颜滤镜下的市场&#xff0c;传给新人小伙伴了&#xff01; 大家好&#xff0c;我是微三云胡佳东&#xff0c;一家软件公司负责人&#xff01; …

keystone学习小结

1 keystone middleware 1.1 工作流程 middleware在客户端和服务端之间&#xff0c;会拦截客户端请求并判断请求身份是否是正确合法的&#xff0c;若是&#xff0c;则继续将请求发给其他middleware或app 具体看&#xff0c;干了这些事 1将请求里的auth header去除&#xff0c…

景源畅信:想要做抖音电商有哪些适合的发展渠道?

在数字浪潮的推动下&#xff0c;抖音电商如同一股不可阻挡的潮流&#xff0c;正吸引着无数创业者和品牌的目光。如何在这一领域获得成功&#xff0c;选择合适的发展渠道成为关键。接下来&#xff0c;让我们深入探讨这一话题&#xff0c;揭开抖音电商成功之路的秘密。 一、内容创…

C# Web控件与数据感应之 TreeView 类

目录 关于 TreeView 一些区别 准备数据源 范例运行环境 一些实用方法 获取数据进行呈现 ​根据ID设置节点 获取所有结点的索引 小结 关于 TreeView 数据感应也即数据捆绑&#xff0c;是一种动态的&#xff0c;Web控件与数据源之间的交互&#xff0c;本文将继续介绍与…

Idea + maven 搭建 SSH (struts2 +hibernate5 + spring5) 环境

org.apache.struts struts2-core 2.3.35 org.apache.struts struts2-spring-plugin 2.3.35 org.apache.struts struts2-json-plugin 2.3.8 1.4 配置Java EE 坐标依赖 这里可以引入 servlet api&#xff0c;jstl 标签库等一系列工具 javax.servlet javax.servlet-api …

c语言实现贪吃蛇小游戏————附全代码!!!

目录 1.Win32 API 1.1控制台应用程序 1.2控制台的名称&#xff0c;控制台窗口大小 1.3设置控制台光标位置 COORD - 光标坐标 GetStdHandle - 获取句柄 SetConsoleCursorPosition - 设置光标位置 封装一个设置光标的函数 1.4设置控制台光标的属性 CONSOLE_CURSOR_INFO …

【第13章】spring-mvc之validator

文章目录 前言一、准备1. 引入库2. add.jsp3. show.jsp 二、代码部分1.实体类2. 控制器类3. 效果4. 展示 总结 前言 【第20章】spring-validator 虽然前面已经在spring介绍过&#xff0c;但是为了保证代码可用&#xff0c;还是会从头讲到尾&#xff0c;尽量把关键点列出来讲给…

微服务架构中的挑战及应对方式:Outbox 模式

使用 Outbox 模式保持微服务数据一致性 在一个由许多小型服务组成的系统中保持数据一致性是困难的&#xff0c;因为它们分散在各处。以下是一些常见问题以及如何处理它们的方法&#xff1a;当服务发送消息时&#xff0c;同时更新数据库和发送消息是棘手的问题。 在微服务中发出…

【Qt 开发基础体系】Qt信号与槽机制

文章目录 1.Qt 信号与槽机制原理&#xff08;Signal & Slot&#xff09;2. QObject 类 connect 的介绍3. 信号与槽机制连接方式4. 信号和槽机制优势及其效率&#xff1a;3. 信号与槽机制应用 1.Qt 信号与槽机制原理&#xff08;Signal & Slot&#xff09; &#x1f42…

通过AOP实现项目中业务服务降级功能

最近项目中需要增强系统的可靠性&#xff0c;比如某远程服务宕机或者网络抖动引起服务不可用&#xff0c;需要从本地或者其它地方获取业务数据&#xff0c;保证业务的连续稳定性等等。这里简单记录下业务实现&#xff0c;主要我们项目中调用远程接口失败时&#xff0c;需要从本…

《武林秘籍》——闪侠惠递如何让消费者寄快递更安心!

现如今&#xff0c;网上下单寄快递的便利性让众多人享受到了电商物流飞速发展带来的红利性。今天小编直接介绍一款寄快递特别省钱的利器&#xff0c;就是利用闪侠惠递来寄快递。闪侠惠递寄快递&#xff0c;真正的实现了便宜寄快递发物流的便捷性&#xff0c;开创了低价发快递的…
最新文章