模板-1-模板类的特化

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

类模板的特化

  • 语义: 表明该模板类在特殊的类型下具有不同的行为.

    • 类的定义,应该与模板类放入一个头文件中,告知编译器该特化类的存在;

    • 类成员的定义,应该放入源文件中.该特化类就与普通类一样,是一个实实在在存在的实体.

  • 语法: 仍依'template<>'表明该类是一个模板,但被特化的类;

    • 类外定义特化类的成员时,不应添加'template<>'标记.

template<>
class    类名<特化类的模板实参表>{/* 特化类的定义 */
};

  • 对特化类的要求: 类名与模板类一致即可,其余没有任何限制:特化类可以具有不同的成员集合,特化类可以具有不同的父类....

template<typename Type1,typename Type2>
class   X{
public:void    print(){ Println("模板类: Type1: %s\tType2: %s",getTypeName(Type1),getTypeName(Type2)); }
};template<>
class   X<int,double>{
public:void    print();void    test(){}
};/* 不要添加'template<>'标记 */
void    X<int,double>::print(){ Println("特化类: Type1: int\tType2: double"); }int main(int argc,char *argv[]){X<double,double>    dd;dd.print();
//  dd.test();  /* 错误!X<double,double>不存在test()成员函数. */X<int,double>       id;id.print();id.test();  /* 只要X<int,double>中才存在test()成员函数 */
}

特化成员而不特化类

  • 语义: 表明该模板类在指定的模板实参下,其某些成员具有不同的行为.

  • 语法: 见下面的例子. 

    • 特化成员的声明应该与模板类放在同一个头文件中.

    • 如果成员特化后是一个实实在在的函数,则应该放入源文件中;否则应该放入头文件中.

/* TestTem.h --- 模板类及其布特化成员的声明 */
#define     getTypeName(type)       typeid(type).name()
#define     PrintType(type) Println(#type ": %s",getTypeName(type));template<typename Type1>
struct TestTem {template<typename Type2>void    func2();void    func1();
};/* 成员func1的特化声明.此时func1是一个实实在在的函数 */
template<>
void    TestTem<float>::func1();/* 模板成员func2的特化声明,此时仅特化了一部分.所以特化后的func2仍是模板. */
template<> template<typename Type2>
void    TestTem<float>::func2();/* 模板成员 func2 的特化声明,此时进行了全部特化,func2也是一个实实在在的函数. */
template<> template<>
void    TestTem<float>::func2<double>();/* --- TestTem成员定义 ---- */
template<typename Type1>
void    TestTem<Type1>::func1(){Println("模板: %s",getTypeName(Type1));
}
template<typename Type1> template<typename Type2>
void    TestTem<Type1>::func2(){Println("模板: %s\t%s",getTypeName(Type1),getTypeName(Type2));
}/* --- 特化函数func2的定义 --- */
template<> template<typename Type2>
void    TestTem<float>::func2(){ Println("1特化: double\t%s",getTypeName(Type2)); }/* TestTem.cc --- 特化成员的定义 */
/* 成员func1的特化声明.此时func1是一个实实在在的函数 */
template<>
void	TestTem<float>::func1(){ Println("特化: int"); }/* 模板成员 func2 的特化声明,此时进行了全部特化,func2也是一个实实在在的函数. */
template<> template<>
void	TestTem<float>::func2<double>(){ Println("2特化: float\tdouble"); }

类模板的部分特化

  • 部分特化的类仍然是模板,可以与其特化类具有完全不同的成员集合,父类..

#define		TypeName(type)		typeid(type).name()
#define 	PrintType(type) Println(#type ": %s",TypeName(type));template<typename Type1,typename Type2,typename Type3>
struct	X{void	print(){ Println("模板: %s\t%s\t%s",TypeName(Type1),TypeName(Type2),TypeName(Type3)); }
};/* 是其模板类模板形参表的子集 */
template<typename Type2>
struct	X<int,Type2,double>{/* 此时 Type1=int,Type3=double */void	print(){ Println("特化: i\t%s\td",TypeName(Type2)); }
};X<double,double,double>    x;    /* 使用模板类,此时 Type1=Type2=Type3=double */
X<int,double,double>    x1    /* 使用部分特化类,此时 Type1=int,Type2=double,Type3=double */


转载于:https://my.oschina.net/u/1383479/blog/221453

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291540.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac环境下分别用vim和Xcode运行C++(hello word)程序

1、用vim写第一个C++程序 1) 打开mac终端 2) 用vim新建一个test.cpp文件 vim test.cpp 3) 写hello word代码 输入插入命令 i 写入代码 #include<iostream>using namespace std;int main() {cout<<"hello word"<<…

C# 内存法图像处理

内存法通过把图像储存在内存中进行处理&#xff0c;效率大大高于GetPixel方法&#xff0c;安全性高于指针法。 笔者当初写图像处理的时候发现网上多是用GetPixel方法实现&#xff0c;提到内存法的时候也没有具体实现&#xff0c;所以笔者在这里具体实现一下- -&#xff0c;望指…

mysql分组查询和子查询语句_6.MySQL分组聚合查询,子查询

自己的MySQL阅读笔记&#xff0c;持续更新&#xff0c;直到看书结束。数据库技术可以有效帮助一个组织或者企业科学、有效的管理数据&#xff0c;也是现在很多企业招聘数据分析师的必备要求之一。大家如果看过MySQL的书&#xff0c;也可以看我的知识导图做一个复习&#xff0c;…

swf 文件在线播放的,怎么能够下载呢?(除视频外其它都可)

点击播放SWF文件的网页上方工具的Internet选项&#xff0c;点击设置&#xff0c;再点击查看文件&#xff0c;里面有播放的SWF文件图标&#xff0c;把它复制就可以了。转载于:https://blog.51cto.com/wangheyu1/1894807

ABP vNext微服务架构详细教程——分布式权限框架(下)

3公共组件添加公共类库Demo.Permissions&#xff0c;编辑Demo.Permissions.csproj文件&#xff0c;将 <Project Sdk"Microsoft.NET.Sdk"> 改为&#xff1a;<Project Sdk"Microsoft.NET.Sdk.Web">为Demo.Permissions项目添加Nuget引用Volo.Abp.…

ios开发第一步--虚拟机安装MAC OS X

暂时还没买Macbook&#xff0c;先用虚拟机练练手。 先说说准备工作&#xff0c;我是在win8下安装的&#xff0c;这个不是关键的&#xff0c;只要Vmware版本和MAC OS X版本确定就行了&#xff0c;win7下同样可以。 1、虚拟机Vmware10.0.0 下载地址 http://pan.baidu.com/s/1jGv…

算法学习笔记(三)-----各种基础排序问题

2019独角兽企业重金招聘Python工程师标准>>> 一、直接插入排序&#xff1a;是最简单的排序方法&#xff0c;算法简单来说就是可以把第一个数a[0]看做有序数组&#xff0c;那么a[1]要插入进来&#xff0c;对比&#xff0c;插入合适位置&#xff1b;然后a[0],a[1]是有…

mac之把打开终端设置快捷键为Ctrl+Alt+T

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程 1、在Automator.app中创建一个AppleScript Finder&#xff0d;>应用程序->Automator打开Automator.app&#xff0c;打开Automator后…

基础磁盘管理

一、设备文件Linux中设备类型分为字符设备与块设备&#xff0c;他们特点分别为&#xff1a;块设备特性&#xff1a;以“块”为单位进行存取&#xff0c;随机访问&#xff0c;例如磁盘字符设备特性&#xff1a;以“字节”单位进行存取&#xff0c;线性访问&#xff0c;例如键盘设…

redhat yum 安装 mysql_Redhat 7 下Mysql8.0.19安装配置图文详解(配合使用 centos YUM源)...

MySQL Database Service数据库服务器具有以下特点&#xff1a; 具有分析引擎的MySQL数据库服务&#xff1a; MySQL数据库服务是一项完全托管的数据库服务&#xff0c;可使用世界上最受欢迎的开源数据库来部署云原生应用程序。MySQL Analytics Engine将性能提高了400倍。 MySQL企…

Elasticsearch数据库

什么是ElasticsearchElasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java语言开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是一种流行的企业级搜索引擎。…

mac之自己摸索的常用快捷键总结

开终端设置快捷键为&#xff1a; CtrlAltT why click here http://blog.csdn.net/u011068702/article/details/63685920 页面最大化&#xff1a; Ctrl Command F 页面最大化后缩小为中等页面&#xff1a; Ctrl Command F 页面最小化&#xff1a; Command M 恢复最…

HTML5 Canvas 画纸飞机组件

纸飞机模拟一个物体在规定设计轴线偏离方位。 1 //三角形2 function DrawTriangle(canvas, A, B, C) {3 //画个三角形,“A、B、C”是顶点4 with (canvas) {5 moveTo(A[0], A[1]);6 lineTo(B[0], B[1]);7 lineTo(C[0], C[1]);8 lineTo(…

[tools]notepad++当前文件路径不是工作路径

Time:2015/04/09 描述&#xff1a; 在notepad中运行lua&#xff0c;工作路径不是当前文件的路径&#xff0c;而是notepad的安装目录 修改&#xff1a; 把差将中的NppExec --> Follow $(CURRENT_DIRECTORY)勾上即可 参考&#xff1a; [1]http://bbs.chinaunix.net/thread-407…

OPPO R9凭创新赢得2000万销量,成2016年热销手机

2016年的手机市场虽然新闻不断但是整体状况并没有以往那么好&#xff0c;各方数据显示&#xff0c;2016年全年全球智能型手机出货量仅有2.3%的微幅增长&#xff0c;虽然中国市场的全年出货量通同比增长6%&#xff0c;但是比往年也大有不如&#xff0c;手机市场已从增量市场进入…

windows7 nginx php mysql_windows7配置Nginx+php+mysql的详细教程

最近在学习php&#xff0c;想把自己的学习经历记录下来&#xff0c;并写一些经验&#xff0c;仅供参考交流。此文适合那些刚刚接触php&#xff0c;想要学习并想要自己搭建Nginxphpmysql环境的同学。当然&#xff0c;你也可以选择集成好的安装包&#xff0c;比如 wamp等&#xf…

基于C#的计时管理器

问题我们使用各种系统时候会遇到以下问题&#xff1a;12306上购买火车票如果15分钟内未完成支付则订单自动取消。会议场馆预定座位&#xff0c;如果10分钟内未完成支付则预定自动取消。在指定时间之后&#xff0c;我需要执行一项任务。我之前做的很多系统&#xff0c;往往都是定…

C语言之malloc和free总结

1、内存分配和函数介绍 内存分配:指在程序执行的过程空间中或者回收存储空间 ,内存分配分为静态内存分配和动态内存分配 ,要实现动态内存分配,就需要有执行这个操作的对象。C语言提供的两个标准库函数:malloc和free。 1)malloc函数 原型:void *malloc(size_t size)…

哈希表(hashtable)的javascript简单实现

javascript中没有像c#,java那样的哈希表(hashtable)的实现。在js中,object属性的实现就是hash表,因此只要在object上封装点方法,简单的使用obejct管理属性的方法就可以实现简单高效的hashtable。 首先简单的介绍关于属性的一些方法&#xff1a; 属性的枚举: for/in循环是遍历对…

HDU 2516 (Fabonacci Nim) 取石子游戏

这道题的结论就是&#xff0c;石子的个数为斐波那契数列某一项的时候&#xff0c;先手必败&#xff1b;否则&#xff0c;先手必胜。 结论很简单&#xff0c;但是证明却不是特别容易。找了好几篇博客&#xff0c;发现不一样的也就两篇&#xff0c;但是这两篇给的证明感觉证得不清…