C++ Template 特化与重载

2023-11-05

特化与重载:

1.重载函数模板:
  与普通函数一样,函数模板也可以重载.在重载函数模板的时候,应该把改变限制在一下两种情况:改变参数的数目或者显示地指定模板参数.除此之外,函数的所有重载版本的声明都应该位于该函数被调用的位置之前.

P.S:
  类模板是不能被重载的.

2.特化:

  1`全局类模板的的特化:
  如果要特化一个类模板,就要特化该类模板的所有成员函数.引入全局特化需要用到3个标记序列:template,<和>.还有紧跟在类名称声明后面的就是要进行特化的模板实参.而且必须在类名的后面直接指定.

  指定的模板参数列表必须和相应的模板参数列表一一对应,如果模板参数具有缺省模板实参,那么用来替换的模板实参就是可选的.

  进行类模板的特化时,每个成员函数都必须重新定义为普通函数(也就是说不能用template<>前缀),原来模板函数中的每个参数也相应地被进行特化的类型取代.

例如:
template<typename T>
class test
{
public:
  void foo()
  {
   ///doing
  }
}
//特化
template<>
class test<int>
{
public:
  void foo();
}

void test<int>::foo()
{
  //doing other
}

P.S:
  1)特化的实现可以和基本类模板的实现完全不同.

  2)可以用全局函数模板特化来代替对应反省模板的某个实例化体,然而,全局模板特化和由模板生成的实例化版本是不能共存与同一个程序中的.如果要试图在同一个文件中使用这两者的话,就会导致一个编译器错误.


  2`全局函数模板特化:
  全局函数模板特化和类模板特化大体上一致,唯一的区别在于:函数模板特化引入了重载和实参演绎这两个概念.
 
  全局函数模板特化不能包含缺省的实参值.然而,对于基本(即要被特化的)模板所指定的任何缺省参数,显示特化版本都可以应用这些缺省值.


  3`全局成员特化:
  除了成员模板之外,类模板的成员函数和普通的静态成员变量也可以被全局特化.实现特化的语法会要求给每个外围类模板加上template<>前缀.如果要对一个成员函数模板进行特化,也必须加上另一个template<>前缀.

例如:
template<typename T>
class test
{
public:
  void foo()
  {
     //doing....
  }
}

template<>
void test<int>::foo()
{
  //do other...
}


  4`局部的类模板特化:
  类模板也可以被局部热化.可以在特定的环境下指定类模板的特定实现,并且要求某些模板参数仍然必须由用户来定义.如果有多个局部特化同等程度地匹配某个声明,那么该声明就有二义性.

例如:
template<typename T1, typename T2>
class MyClass
{
///...
};

template<typename T>
class MyClass<T, T>
{
///...
};

template<typename T>
class MyClass<T, int>
{
///...
};

template<typename T1, typename T2>
class MyClass<T1*, T2*>
{
///...
};


  对于局部特化声明的参数列表和实参列表,存在一些约束,如下:
  1)局部特化的实参必须和基本模板的相应参数在种类上(可以是类型,非类型或者模板)是匹配的.

  2)局部特化的参数列表不能具有缺省实参.但局部特化仍然可以使用基本类模板的缺省实参.

  3)局部特化的非类型实参只能是类型类值,或者是普通的非类型模板参数.而不能是更复杂的依赖型表达式.

  4)局部特化的模板实参列表不能和基本模板的参数列表完全等同.

转载于:https://www.cnblogs.com/suiyu/archive/2011/11/24/2262139.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ Template 特化与重载 的相关文章

随机推荐

  • latex中长公式换行,很好的办法

    今天在编辑公式时 有一个公式很长 写到一行就出去了 当时之前换行都是方程组或者在括号完之后换 都没有问题 但是今天我也换行的是在括号中间断开 这样出现问题 编辑的时候会出错误提醒 上网查了一些论坛 也有人和我一样的问题 但是都没有解决方案
  • 操作系统存储器管理之连续、页式、段式、段页式存储器管理方式

    基本内存分配方案 4 3 连续分配存储管理方式 连续分配方式 是指为一个用户程序分配一个连续的内存空间 4 3 1单一连续分配 内存分为两个区域 系统区 用户区 应用程序装入到用户区 可使用用户区全部空间 最简单 适用于单用户 单任务的OS
  • 抖音帐号注册需要注意什么

    虽然短视频是大势所趋 但是我们在抖音上也不能瞎玩 注册时需要避开哪些坑 怎样才能更快的吸引到第一批粉丝 新手一定不要错过今天的课程干货 首先 你要记住账号注册一卡一号一手机新手在抖音账号注册 其次 简介中需要用简练的语言体现出账号的内容及特
  • 基于VirtualBox虚拟机安装Ubuntu图文教程

    一 下载安装VirtualBox 官网下载VirtualBox 目前版本 VirtualBox 5 1 8 for Windows hosts x86 amd64 下载好了安装VirtualBox 一路Next就可以了 这个比较简单 运行V
  • 创意特效分享:用代码绘制网页上的爱心

    在网页设计中 为了增加用户体验和吸引用户的注意力 常常需要添加一些特效来增添页面的互动性和趣味性 其中 爱心特效是一种常见且受欢迎的效果 能够在用户与网页进行交互时展现出迷人的动态效果 通过使用HTML CSS和JavaScript 我们可
  • MySQL - 表字段的唯一键约束

    设置表字段唯一约束 UNIQUE UK 当数据库表中某个字段上的内容不允许重复时 可以使用UK约束进行设置 UK约束在创建数据库时为某些字段加上 UNIQUE 约束条件 保证所有记录中该字段上的值不重复 如果在用户插入的记录中该字段上的值与
  • switch 语句,while 循环,for 循环和do while循环

    switch 语句 switch 语句是 种特殊形式的 if else 结构 于判断条件有多个结果的情况 它把多重的 else if 改成更易 可读性更好的形式 例如 include
  • Linux多线程:条件变量

    条件变量的类型 pthread cond t 作用 满足某个条件阻塞或者解除阻塞某个线程 int pthread cond init pthread cond t restrict cond const pthread condattr t
  • CTFweb篇——html源代码签到题

    0x00 前言 做CTF的web中Html查看源代码的题还是比较简单 对我而言 就是在源代码中找寻相关的关键字或者线索 0x01 签到题 进入靶场发现当前页面 最开始怀疑是靶场原因没进去 仔细研究后发现自己被障眼法了 初次做题的时候 在懵逼
  • java.lang.ArithmeticException: Division undefined 或者 java.lang.ArithmeticException: / by zero

    今天线上报了一个这样的错误 经过排查发现是因为对Bigdecimal类型做除法divide 运算时 除数为0导致的 加了一个非0的判断就好了 当我们的被除数为整型 short int long 时 除数不能为0 除数如果为double 即
  • npm install报错

    1 在安装sass时报错 C Users dong Downloads CapecAnalyzer master CapecAnalyzer master WebAppCapec node modules node sass src lib
  • IDEA2022性能优化的一些设置

    因为本人电脑配置比较低 导致IDEA用起来卡卡的 经过设置之后有所缓解 可以参考 我这里IDEA版本为 2022 1 2 注意区分版本 1 关掉没用的插件 IDEA预装的插件是很多的 有很多都用不上 比如说新版本会有 code with m
  • tcp port numbers reused出现原因_图文并茂详解TCP的3次握手+4次挥手+11种状态集

    2TCP的介绍 TCP也叫传输控制协议 Transmission Control Protocol 是一种面向连接的 可靠的 基于字节流的传输层通信协议 由IETF的RFC 793定义 3TCP的特点1 面向连接 TCP通信需要经过创建连接
  • 接口测试详细步骤(入门+实用)

    1 拿到接口文档的时候先分析文档 分析的内容有 请求类型 必填项 选填项 入参 出参及描述 2 编写测试用例 测试用例的编写参考下图 3 利用postman jmeter或者其它接口测试工具执行测试用例 4 把测试后的的响应数据与数据库中自
  • 【StyleGAN2论文精读CVPR_2020】Analyzing and Improving the Image Quality of StyleGAN

    StyleGAN2论文精读CVPR 2020 Analyzing and Improving the Image Quality of StyleGAN 一 前言 Abstract 1 Introduction 2 Removing nor
  • linux下的守护进程(daemon)和系统日志(syslog)

    目录 守护进程daemon 参数 编程示例 日志系统syslog 函数原型 openlog函数及其参数说明 打开系统日志 参数说明 参数说明 编程示例 守护进程daemon Unix Linux中的守护进程 Daemon 类似于Window
  • 如何在OS X 10.7上开发一个简单的应用教程(一)

    原文 http www raywenderlich com 17811 how to make a simple mac app on os x 10 7 tutorial part 13 原创译文 转载注明出处 http blog csd
  • 汽配企业建设数字化工厂的步骤是什么

    随着信息技术的迅猛发展 汽车行业也面临着数字化转型的迫切需求 汽配企业作为汽车产业链上重要的一环 也需要积极采取措施 建设数字化工厂系统 以适应市场竞争的变化 下面将介绍建设汽配企业数字化工厂的具体步骤 第一步 制定数字化转型策略 汽配企业
  • 小程序 已被代码依赖分析忽略,无法被其他模块引用。你可根据控制台中的【代码依赖分析】告警信息修改代码,或关闭【过滤无依赖文件】功能

    出现以下错误 NO1 刚开始搜网说要在开发工具 右上角 详情 gt 本地设置 gt 上传时过滤无依赖文件 关闭即可 但是并没什么用其实 NO2 只需在 project config json gt setting 里面设置 ignoreUp
  • C++ Template 特化与重载

    特化与重载 1 重载函数模板 与普通函数一样 函数模板也可以重载 在重载函数模板的时候 应该把改变限制在一下两种情况 改变参数的数目或者显示地指定模板参数 除此之外 函数的所有重载版本的声明都应该位于该函数被调用的位置之前 P S 类模板是