模板-1-模板类的特化
2019独角兽企业重金招聘Python工程师标准>>>
类模板的特化
语义: 表明该模板类在特殊的类型下具有不同的行为.
类的定义,应该与模板类放入一个头文件中,告知编译器该特化类的存在;
类成员的定义,应该放入源文件中.该特化类就与普通类一样,是一个实实在在存在的实体.
语法: 仍依'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
模板-1-模板类的特化相关推荐
- C++之函数模板、类模板、模板的特化
目录 1.什么是模板? 2.类模板的定义如下: 3.模板分类? 1.模板参数有两种: 2.模板的类型 1.函数模板 2.类模板 4.模板实例化 5.模板实现链栈 1.C语言版 2.C++版本 1.什么 ...
- binarytreenode”使用 类 模板 需要 模板 参数列表_c++1117 模板核心知识(一)—— 函数模板...
目录 定义函数模板 使用函数模板 两阶段翻译 Two-Phase Translation 模板的编译和链接问题 多模板参数 引入额外模板参数作为返回值类型 让编译器自己找出返回值类型 将返回值声明为两 ...
- 函数模板与类模板(模板类)
什么是泛型编程? 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段.模板是泛型编程的基础. 模板分为函数模板和类模板 下面我们就来说说函数模板: 函数模板与类型无关,在使用时被参数化,根据实参 ...
- C++知识点59——类模板(4、类模板的模板参数是一个类模板)
接上一篇文章https://blog.csdn.net/Master_Cui/article/details/111824152 七.类模板的模板参数是一个模板类 类模板的模板参数本身可以是一个类模板 ...
- 泛函编程—模板函数_类模板
函数业务逻辑一样,只是函数参数类型不同 函数模板的本质:类型参数化--泛型编程 语法: template <typename T> template <class T1,class ...
- 问模板函数、函数模板,模板类、类模板的区别的问题?
问模板函数.函数模板,模板类.类模板的区别的问题? - 赵保龙 - 博客园 问模板函数.函数模板,模板类.类模板的区别的问题? 在C++中有好几个这样的术语,但是我们很多时候用的并不正确,几乎是互相替 ...
- 类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器
1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPush ...
- 关于模板函数/模板类编译成DLL
]关于模板函数/模板类编译成DLL Posted on 2011-08-16 08:48 单鱼游弋 阅读( 353) 评论( 0) 编辑 收藏 要编译成DLL,就要声明和实现分开. 首先文件组织是这样 ...
- C++ 泛型编程(一):模板基础:函数模板,类模板,模板原理,模板匹配规则
类模板 函数模板 泛型编程 泛型编程,泛型即是指具有在多种数据类型上皆可操作的含义,其实就是能够帮助开发者编写完全一般化并可重复使用的算法,同样的工作不需要做多次,同样的算法针对不同的类型也不应该写多 ...
最新文章
- boost::spirit模块实现逗号分隔的数字列表的解析器的测试程序
- python matlabplot animate 刷新_matlab动态绘图Animation
- 学习笔记(一)(x264编码流程)
- Windows Server 2012 R2安装体验
- 【报告分享】中国隐私计算产业发展报告(2020-2021).pdf(附下载连恶疾)
- Java实验7 四、Java异常类(2)创建自己的日期错误异常类
- 你怎么看当前中文语音识别技术在国内的应用?
- Java程序卡住问题的解决
- openlayers集成echarts实现百度迁徙的模拟
- 心理学第二周学习笔记:心理学的历史和流派
- 各种笔记本进入BIOS的快捷键
- Linux下php如何把word转为图片
- 什么电子邮箱最安全,什么邮箱更具私密性?
- Git全解 idea github gitee gitlab
- 【 MySQL1064错误代码】
- 从administrators组中删除guest来宾账户时提示无法在内置账号上运行此操作的解决办法...
- 弘辽科技:拼多多怎么提升访客量?有哪些方法?
- 环信开发的坑(环信客户互动云)
- 华为mstp配置实例
- 2022-2027年中国蛋白质粉行业市场深度分析及投资战略规划报告
热门文章
- mac搭建本地svn
- 基于Angularjs实现分页
- Django实战(1):需求分析和设计
- mysql 左连接 怎么走索引_mysql left join查询没走索引
- rstudio 导出结果_RStudio如何完美导出包含中文的图
- 最常用计算机信息呼唤标准代码,计算机考试题
- 2021年慈溪横河中学高考成绩查询,慈溪中学
- oracle 不等于某类,Oracle如何查询不等于某数值
- 微型计算机系统包括( )几部分,微型计算机系统包括哪几个部分?
- MYSQL的函数有哪些?(4.2时间与日期函数)