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

C++模版特化和偏特化

什么是模版特化

特化的含义:所谓特化,就是将泛型搞得具体化一些,从字面上来解释,就是为已有的模板参数进行一些使其特殊化的指定,使得以前不受任何约束的模板参数,或受到特定的修饰(例如const或者摇身一变成为了指针之类的东东,甚至是经过别的模板类包装之后的模板类型)或完全被指定了下来。

函数模板的特化:当函数模板需要对某些类型进行特化处理,称为函数模板的特化。

类模板的特化:当类模板内需要对某些类型进行特别处理时,使用类模板的特化。

特化整体又分全特化与偏特化

全特化:全特化也就是定义了一个全新的类型,全特化的类中的函数可以与模板类不一样。

偏特化:就是模板中的模板参数没有被全部确定,需要编译器在编译时进行确定。

模板函数只能全特化,没有偏特化(以后可能有)。

模板类是可以全特化和偏特化的。

全特化的标志:template <>然后是完全和模板类型没有一点关系的类实现或者函数定义

偏特化的标志:template

怎么实现模版特化

这是一个函数模版

template <class T>
int compare(const T &left, const T&right)
{std::cout <<"in template<class T>..." <<std::endl;return (left - right);
}

我们对这个模版函数进行特化

template < >
int compare<const char*>(const char* left, const char* right)
{std::cout <<"in special template< >..." <<std::endl;return strcmp(left, right);
}
//第二种
template < >
int compare(const char* left, const char* right)
{std::cout <<"in special template< >..." <<std::endl;return strcmp(left, right);
}

函数模版特化的步骤:

必须要先有一个基础的函数模板

使用特换模板函数时格式有要求:
1、关键字template后面接一对空的尖括号<>
2、函数名<特化类型>(特化类型 参数1, 特化类型 参数2 , …) 在函数名后跟<>其中写要特化的类型

函数形参表必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误。

类模版特化步骤

类模板的特化:与函数模板类似,当类模板内需要对某些类型进行特别处理时,使用类模板的特化。

模板参数的类模板特化的几种类型

一是特化为绝对类型;

二是特化为引用,指针类型;

三是特化为另外一个类模板。

模版偏特化

模板偏特化是对模板的部分参数进行特化。它允许你针对模板参数的某些特定情况提供专门的实现,而不是完全特化所有的模板参数。

   template <typename T1, typename T2>class MyClass {public:void print() {std::cout << "模板" << std::endl;}};template <typename T1>class MyClass<T1, int> {public:void print() {std::cout << "T2 的部分特化为 int" << std::endl;}};

模板特化和偏特化使得 C++模板更加灵活,可以根据不同的类型和特定情况提供定制化的实现。

http://www.lryc.cn/news/490421.html

相关文章:

  • Simulink中Model模块的模型保护功能
  • Linux常用工具的使用(2):文本编辑器的使用
  • 【StarRocks】starrocks 3.2.12 【share-nothing】 多Be集群容器化部署
  • 联想ThinkServer服务器主要硬件驱动下载
  • Ansys Zemax Optical Studio 中的近视眼及矫正
  • 三次握手后的数据传输
  • 企业OA管理系统:Spring Boot技术实现与案例研究
  • (免费送源码)计算机毕业设计原创定制:Java+JSP+HTML+JQUERY+AJAX+MySQL springboot计算机类专业考研学习网站管理系统
  • Go语言工程测试的基本规则和流程
  • 阿里云cdn配置记录和nodejs手动安装
  • PTC在电池中的作用
  • 嵌入式C语言面试题 - 2024/11/18
  • 理解原子变量之四:可见性、memory_order_acquire与 memory_order_release
  • requests的session
  • MySQL面试题补
  • Windows系统编程 - 进程遍历
  • 从零开始创建一个 Vue3+Vite+TS+Eslint项目
  • Python操作neo4j库py2neo使用(一)
  • Oracle - 多区间按权重取值逻辑 ,分时区-多层级-取配置方案(二)
  • leetcode刷题记录(四十二)——101. 对称二叉树
  • AutoDL安装docker问题
  • C++头文件大全(要是还有请帮忙)
  • 深度学习实战人脸识别
  • oracle排查长时间没提交的事务造成的阻塞案例
  • React第七节 组件三大属性之 refs 的用法注意事项
  • 工程企业需要什么样的物资管理系统?为什么需要物资管理系统?
  • 基于网页的大语言模型聊天机器人
  • 深入理解索引(一)
  • 动态规划子数组系列一>最长湍流子数组
  • MATLAB矩阵元素的修改及删除