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 特化与重载 的相关文章

  • 每天都在谈SOA和微服务,但你真的理解什么是服务吗?

    近几年来 我一直从事着和面向服务相关的底层软件研发工作 逐渐的形成了一些自己的看法 其中我觉得比较重要的看法就是服务需要一个更准确细致的定义 简单来说 服务的本质就是行为 业务活动 的抽象 为了更好的阐述新服务的概念 并方便与传统的SOA中
  • C++知识积累:内存对齐理解

    为什么要进行内存对齐 这是因为CPU的读取总是对齐的 举个例子 假设CPU是32位的 那么CPU每次读取的4字节数据的首地址都是4的倍数 也就是说 内存中数据首地址为4的倍数时 CPU一次操作就可以完成数据读取 假设有一个int型四字节大小
  • 编写递归算法,计算二叉树叶子结点的数目。

    编写递归算法 计算二叉树叶子结点的数目 编写递归算法 计算二叉树叶子结点的数目 include stdio h 包含 getchar scanf printf include malloc h malloc 动态申请空间 函数 二叉树 结点
  • std::nth_element bug引起的crash问题

    1 源码 auto less compare const MirroringGroup mg1 const MirroringGroup mg2 gt bool return mg1 usage lt mg2 usage std nth e
  • 互联网创业盈利模式指南

    看了很多创业的case 都有点下笔千言 离题万里的 情况 就是很多case都很精彩 但是公司 的价值最终是落实到 给创业者和投资人的回报的 因此 所有的case 最终都是 落实到盈利 模式上 一位投资人士说的很明确 中国的盈利模式很简单 就
  • 无法打开源文件<sys/time.h>,但是用time.h编译就会出错,缺少gettimeofday()

    因为sys time h是uinx系统下的库文件 而现在使用的平台是在windows 由于未指明程序运行的系统 导致找不到对应的头文件 需要重新实现gettimeofday 函数 define WIN32 include
  • C/C++ 引用作为函数的返回值

    语法 类型 函数名 形参列表 函数体 特别注意 1 引用作为函数的返回值时 必须在定义函数时在函数名前将 2 用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本 代码来源 RUNOOB include
  • GDAL多光谱与全色图像融合简单使用

    目录 简述 C 代码 效果对比 GDAL融合效果和原始多光谱波段对比 GDAL融合效果和原始全色波段对比 ARCGIS融合效果与原始全色和多光谱对比 GDAL融合效果与ArcGIS融合效果对比 简述 最近在GDAL的代码中看见了gdalpa
  • 【干货】Chrome插件(扩展)开发全攻略(不点进来看看你肯定后悔)<转>

    干货 Chrome插件 扩展 开发全攻略 不点进来看看你肯定后悔 写在前面 我花了将近一个多月的时间断断续续写下这篇博文 并精心写下完整demo 写博客的辛苦大家懂的 所以转载务必保留出处 本文所有涉及到的大部分代码均在这个demo里面 h
  • Trace Function Enter, Exit and Leave

    http developer nokia com community wiki Trace Function Enter Exit and Leave
  • Dev-C++之开启装逼效果

    Dev C 是个不错的C IDE 在10年前 它是很不错 在现在 它是个以界面丑陋和调试像吃粑粑这两点著称 如下图 实在是丑到离谱 丑到无法忍受 可是没办法呀 人家CCF规定比赛用这个 你个小蒟蒻吵什么 我现在就来讲讲怎么把你的Dev C
  • Public Private Protect Inheritance and access specifiers

    In the previous lessons on inheritance we ve been making all of our data members public in order to simplify the example
  • Open3D(C++)实现建筑物点云立面和平面分割提取

    Open3D C 实现建筑物点云立面和平面分割提取 近年来 点云技术在城市规划 机器人地图构建等领域得到广泛应用 本篇文章将介绍如何利用Open3D C 库实现建筑物点云立面和平面分割提取 准备工作 首先需要编译安装Open3D库 本文使用
  • stat 函数解析

    stat 函数的简单使用 stat 函数是用来获取文件的各种属性的一个linux下的常用API函数 函数原型为int stat const char path struct stat buf stat定义如下 struct stat dev
  • 检查内存泄露

    自己编写的视频处理程序出现了一个问题 每帧的运行时间随着运行时间在不断增长 很大可能是出现了内存泄露 于是学习了一些查看内存泄露的方法 做了两种尝试 一是VS自带的DEBUG下的检测 view pl html view plain copy
  • C++中的并发多线程网络通讯

    C 中的并发多线程网络通讯 一 引言 C 作为一种高效且功能强大的编程语言 为开发者提供了多种工具来处理多线程和网络通信 多线程编程允许多个任务同时执行 而网络通信则是现代应用程序的基石 本文将深入探讨如何使用C 实现并发多线程网络通信 并
  • C/C++编程:令人印象深刻的高级技巧案例

    C C 编程语言在软件开发领域有着悠久的历史 由于其高效 灵活和底层访问能力 至今仍然被广泛应用 本文将介绍一些在C C 编程中令人印象深刻的高级技巧 帮助读者提升编程水平 更加高效地使用这两种强大的编程语言 一 指针运算与内存管理 C C
  • C/C++编程中的算法实现技巧与案例分析

    C C 编程语言因其高效 灵活和底层的特性 被广大开发者用于实现各种复杂算法 本文将通过10个具体的算法案例 详细探讨C C 在算法实现中的技巧和应用 一 冒泡排序 Bubble Sort 冒泡排序 Bubble Sort 是一种简单的排序
  • C++ 字符串比较------strcmp函数和strncmp函数

    strcmp 函数原型 int strcmp const char str1 const char str2 功能 strcmp函数会按照字典顺序逐个比较两个字符串的字符 直到遇到不同的字符或者遇到字符串结束符 0 返回值 该函数返回值如下
  • Woocommerce:添加第二个电子邮件地址不起作用,除非收件人是管理员

    我尝试了多种方法来向 Woocommerce 电子邮件添加其他收件人 但它似乎仅适用于主要收件人是管理员的测试订单 这些是我尝试过的片段 如果订单的客户是管理员 则电子邮件将发送到这两个地址 如果订单包含客户电子邮件地址 则仅发送至该电子邮

随机推荐

  • 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 类模板是