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-模板类的特化相关推荐

  1. C++之函数模板、类模板、模板的特化

    目录 1.什么是模板? 2.类模板的定义如下: 3.模板分类? 1.模板参数有两种: 2.模板的类型 1.函数模板 2.类模板 4.模板实例化 5.模板实现链栈 1.C语言版 2.C++版本 1.什么 ...

  2. binarytreenode”使用 类 模板 需要 模板 参数列表_c++1117 模板核心知识(一)—— 函数模板...

    目录 定义函数模板 使用函数模板 两阶段翻译 Two-Phase Translation 模板的编译和链接问题 多模板参数 引入额外模板参数作为返回值类型 让编译器自己找出返回值类型 将返回值声明为两 ...

  3. 函数模板与类模板(模板类)

    什么是泛型编程? 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段.模板是泛型编程的基础. 模板分为函数模板和类模板 下面我们就来说说函数模板: 函数模板与类型无关,在使用时被参数化,根据实参 ...

  4. C++知识点59——类模板(4、类模板的模板参数是一个类模板)

    接上一篇文章https://blog.csdn.net/Master_Cui/article/details/111824152 七.类模板的模板参数是一个模板类 类模板的模板参数本身可以是一个类模板 ...

  5. 泛函编程—模板函数_类模板

    函数业务逻辑一样,只是函数参数类型不同 函数模板的本质:类型参数化--泛型编程 语法: template <typename T> template <class T1,class ...

  6. 问模板函数、函数模板,模板类、类模板的区别的问题?

    问模板函数.函数模板,模板类.类模板的区别的问题? - 赵保龙 - 博客园 问模板函数.函数模板,模板类.类模板的区别的问题? 在C++中有好几个这样的术语,但是我们很多时候用的并不正确,几乎是互相替 ...

  7. 类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器

     1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPush ...

  8. 关于模板函数/模板类编译成DLL

    ]关于模板函数/模板类编译成DLL Posted on 2011-08-16 08:48 单鱼游弋 阅读( 353) 评论( 0) 编辑 收藏 要编译成DLL,就要声明和实现分开. 首先文件组织是这样 ...

  9. C++ 泛型编程(一):模板基础:函数模板,类模板,模板原理,模板匹配规则

    类模板 函数模板 泛型编程 泛型编程,泛型即是指具有在多种数据类型上皆可操作的含义,其实就是能够帮助开发者编写完全一般化并可重复使用的算法,同样的工作不需要做多次,同样的算法针对不同的类型也不应该写多 ...

最新文章

  1. boost::spirit模块实现逗号分隔的数字列表的解析器的测试程序
  2. python matlabplot animate 刷新_matlab动态绘图Animation
  3. 学习笔记(一)(x264编码流程)
  4. Windows Server 2012 R2安装体验
  5. 【报告分享】中国隐私计算产业发展报告(2020-2021).pdf(附下载连恶疾)
  6. Java实验7 四、Java异常类(2)创建自己的日期错误异常类
  7. 你怎么看当前中文语音识别技术在国内的应用?
  8. Java程序卡住问题的解决
  9. openlayers集成echarts实现百度迁徙的模拟
  10. 心理学第二周学习笔记:心理学的历史和流派
  11. 各种笔记本进入BIOS的快捷键
  12. Linux下php如何把word转为图片
  13. 什么电子邮箱最安全,什么邮箱更具私密性?
  14. Git全解 idea github gitee gitlab
  15. 【 MySQL1064错误代码】
  16. 从administrators组中删除guest来宾账户时提示无法在内置账号上运行此操作的解决办法...
  17. 弘辽科技:拼多多怎么提升访客量?有哪些方法?
  18. 环信开发的坑(环信客户互动云)
  19. 华为mstp配置实例
  20. 2022-2027年中国蛋白质粉行业市场深度分析及投资战略规划报告

热门文章

  1. mac搭建本地svn
  2. 基于Angularjs实现分页
  3. Django实战(1):需求分析和设计
  4. mysql 左连接 怎么走索引_mysql left join查询没走索引
  5. rstudio 导出结果_RStudio如何完美导出包含中文的图
  6. 最常用计算机信息呼唤标准代码,计算机考试题
  7. 2021年慈溪横河中学高考成绩查询,慈溪中学
  8. oracle 不等于某类,Oracle如何查询不等于某数值
  9. 微型计算机系统包括( )几部分,微型计算机系统包括哪几个部分?
  10. MYSQL的函数有哪些?(4.2时间与日期函数)