当前位置: 首页 > news >正文

(类)偏特化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.lryc.cn/news/343852.html

相关文章:

  • TypeScript 基础学习笔记:interface 与 type 的异同
  • 【管理咨询宝藏95】SRM采购平台建设内部培训方案
  • 第七届机电、机器人与自动化国际会议(ICMRA 2024)即将召开!
  • 【智能楼宇秘籍】一网关多协议无缝对接BACnet+OPC+MQTT
  • leetCode68. 文本左右对齐
  • 搜狗输入法 PC端 v14.4.0.9307 去广告绿化版.
  • 【汇总】虚拟机网络不通(Xshell无法连接虚拟机)排查方法
  • C++开发基础之函数参数传递的几种类型
  • 使用memcache 和 redis 、 实现session 会话复制和保持
  • Tomcat 优化
  • 如何将pdf文件换成3d模型?---模大狮模型网
  • Docker 中快速构建 Redis Cluster 集群
  • C语言----杨辉三角
  • FlaUI
  • MySQL调优-01反范式化表设计
  • 74从零开始学Java之排序算法中的冒泡和选择排序
  • 【Qt问题】VS2019 Qt win32项目如何添加x64编译方式
  • LabVIEW换智能仿真三相电能表研制
  • Python | Leetcode Python题解之第69题x的平方根
  • libhv http client vs cpr
  • CTFHub-Web-文件上传
  • 笔记2:cifar10数据集获取及pytorch批量处理
  • FSD自动驾驶泛谈
  • golang获取变量动态类型
  • 外企接受大龄程序员吗?
  • 【DevOps】掌控云端:Google Cloud SDK 快速上手
  • 【Unity 踩坑系列】配置VScode环境Downloading the.NET Runtime Failed to download.NET 7.0.9installation timed out
  • 深入了解 NumPy:深度学习中的数学运算利器
  • 鸿蒙开发接口Ability框架:【@ohos.ability.particleAbility (particleAbility模块)】
  • Flutter笔记:Widgets Easier组件库(8)使用图片