加qq1126137994 微信:liu1126137994 一起学习更多技术!!!

1、多参数类模板

类模板可以定义任意多个不同的类型参数

类模板可以被特化:

  • 指定类模板的特定实现
  • 部分类型参数必须显示指定
  • 根据类型参数分开实现类模板

类模板的特化类型:

  • 部分特化
    *用特定规则约束类型参数
  • 完全特化
    *完全显示指定类型参数

看代码:

#include <iostream>
#include <string>using namespace std;template
< typename T1, typename T2 >
class Test
{
public:void add(T1 a, T2 b){cout << "void add(T1 a, T2 b)" << endl;cout << a + b << endl;}
};template
< typename T1, typename T2 >
class Test < T1*, T2* >      // 特化,关于指针的特化实现
{
public:void add(T1* a, T2* b){cout << "void add(T1* a, T2* b)" << endl;cout << *a + *b << endl;}
};template
< typename T >
class Test < T, T >    // 特化 当 Test 类模板的两个类型参数完全相同时,使用这个实现
{
public:void add(T a, T b){cout << "void add(T a, T b)" << endl;cout << a + b << endl;}void print(){cout << "class Test < T, T >" << endl;}
};template
<  >
class Test < void*, void* >    // 完全特化,当 T1 == void* 并且 T2 == void* 时
{
public:void add(void* a, void* b){cout << "void add(void* a, void* b)" << endl;cout << "Error to add void* param..." << endl;}
};int main()
{  /* 必须显示的指定每一个参数的类型 */Test<int, float> t1;Test<long, long> t2;Test<void*, void*> t3;t1.add(1, 2.5);t2.add(5, 5);t2.print();t3.add(NULL, NULL);Test<int*, double*> t4;int a = 1;double b = 0.1;t4.add(&a, &b);return 0;
}

运行结果:

类模板特化注意事项:

  1. 特化,只是模板的分开实现
    *本质上是同一个类模板
  2. 特化后的模板使用方式是统一的
    *必须显示指定每一个类型参数

2、特化的深度分析

问题:
1、类模板与重定义的区别?
2、函数模板可以特化么?

重定义和特化的不同:

  1. 重定义
    *重定义后,一个是类模板,定以后的是一个新类(即两个类模板)
    *使用的时候需要考虑如何选择的问题
  2. 特化
    *特化后的类与类模板是同一个类,以统一的方式使用类模板和特化后的类
    *编译器优先自动选择特化类

函数模板只支持类型参数完全特化:

看代码:

#include <iostream>
#include <string>using namespace std;/* 类模板 */
template
< typename T1, typename T2 >
class Test
{
public:void add(T1 a, T2 b){cout << "void add(T1 a, T2 b)" << endl;cout << a + b << endl;}
};/*
/* 类模板的完全特化 */
template
<  >
class Test < void*, void* >    // 当 T1 == void* 并且 T2 == void* 时
{
public:void add(void* a, void* b){cout << "void add(void* a, void* b)" << endl;cout << "Error to add void* param..." << endl;}
};
*/class Test_Void
{
public:void add(void* a, void* b){cout << "void add(void* a, void* b)" << endl;cout << "Error to add void* param..." << endl;}
};/*函数模板*/
template
< typename T >
bool Equal(T a, T b)
{cout << "bool Equal(T a, T b)" << endl;return a == b;
}/* 参数类型完全特化的函数模板 */
template
< >
bool Equal<double>(double a, double b)
{const double delta = 0.00000000000001;double r = a - b;cout << "bool Equal<double>(double a, double b)" << endl;return (-delta < r) && (r < delta);
}/* 正常函数,用于对比 */
bool Equal(double a, double b)
{const double delta = 0.00000000000001;double r = a - b;cout << "bool Equal(double a, double b)" << endl;return (-delta < r) && (r < delta);
}int main()
{  cout << Equal( 1, 1 ) << endl;cout << Equal<>( 0.001, 0.001 ) << endl;return 0;
}

注意:当需要重载函数模板时,优先考虑模板特化,当模板特化无法满足要求时,再进行函数重载

3、总结

  1. 类模板可以定义任意多个不同类型的参数
  2. 类模板可以被部分特化和完全特化
  3. 特化的本质是模板的分开实现
  4. 函数模板只支持完全特化
  5. 工程中一般使用模板特化代替(函数)重定义

【C++深度剖析教程38】类模板深度剖析相关推荐

  1. 【C++深度剖析教程39】实现C++数组类模板

    上一篇文章在那个学习了多参数类模板与特化的分析:点击链接查看上一篇文章:类模板深度剖析 本篇文章学习记录: 数值型模板参数 实现C++数组类模板 1.模板中的数值型参数 模板参数可以是数值型参数.也就 ...

  2. 【C++深度剖析教程37】类模板的概念和意义

    加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 1.类模板 一些类主要用于存储和组织数据元素 类中数据的组织方式和数据元素的具体类型无关 如 数组类,链表类,st ...

  3. 【C++深度剖析教程40】使用数值型模板技术计算1+2+3+...+N的值

    上一篇文章学习了数值型模板技术,并利用相关技术,实现了C++的数组类模板.点击文章查看上一篇文章:点击链接查看 本篇文章,继续利用模板技术来解决一个问题. 如果想求1+2+3+-+N的结果,有很多种方 ...

  4. oak深度相机入门教程-多类语义分割

      系列文章目录: oak深度相机入门教程-识别眼睛的凝视方向 oak深度相机入门教程-检测是否佩戴口罩 oak深度相机入门教程-文本检测+光学字符识别(OCR)管道 oak深度相机入门教程-识别人的 ...

  5. bert使用做文本分类_使用BERT进行深度学习的多类文本分类

    bert使用做文本分类 Most of the researchers submit their research papers to academic conference because its ...

  6. Deep Learning 10_深度学习UFLDL教程:Convolution and Pooling_exercise(斯坦福大学深度学习教程)...

    前言 理论知识:UFLDL教程和http://www.cnblogs.com/tornadomeet/archive/2013/04/09/3009830.html 实验环境:win7, matlab ...

  7. 真·干货!这套深度学习教程整理走红,从理论到实践的带你系统学习 | 资源...

    铜灵 发自 凹非寺 量子位 出品 | 公众号 QbitAI 寒假/春节小长假给自己充电的真·干货来了. 如果你想要的是一份从理论到实践的深度学习教程清单,如果你想系统了解各类框架.基础网络与各种使用场 ...

  8. 【人工智能项目】深度学习实现10类猴子细粒度识别

    [人工智能项目]深度学习实现10类猴子细粒度识别 任务说明 本次比赛需要选手准确识别10种猴子,数据集只有图片,没有boundbox等标注数据. 环境说明 !nvidia-smi Fri Mar 27 ...

  9. 深度学习教程(10) | 卷积神经网络解读(吴恩达·完整版)

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/35 本文地址:http://www.showmeai.tech/article-det ...

最新文章

  1. FT(Fourier Transform)在滤波上的应用
  2. c语言实现将两个文件复制到一个文件里_Python中复制文件的9种方法
  3. supersocket缓冲区_supersockets接收过滤器(ReceiveFilter)
  4. HDU - 5521 Meeting(最短路+思维建边)
  5. bootstrap 表格不用tr td如何写_Pandas还能用来写爬虫?
  6. dataframe的drop無效
  7. mysql heartbeat 慢_Mysql 慢日志优化分析方法
  8. java gson 工具类_GSON 实体 转换工具类
  9. 【华为云技术分享】用人工智能技术推动西安民俗文化,斗鱼超管团队有一套
  10. [verilog] 八位比较器
  11. 曹德旺的商业哲学:如果你对谁都不相信,必将一事无成
  12. gdb+openocd+stlink调试MCU
  13. 喵的Unity游戏开发之路 - 推球:游戏中的物理
  14. elasticsearch 拼音分词(elasticsearch-analysis-pinyin)
  15. 什么是QA?QA是什么意思?
  16. 麻进:这次不烧作品!
  17. 绘画语言的要素形状b节奏c立面d色彩,环境艺术设计理论考试题目资料.doc
  18. 用计算机术语赞美老师,赞美老师的句子
  19. CVS库,目录入库说明
  20. ATAT 报错Impossible to natch point correlations

热门文章

  1. 第一百二十八期:推荐几个IDEA插件,Java开发者撸码利器,你get到了吗
  2. spring学习(44):p名称空间注入
  3. spring学习(13):使用junit4进行单元测试续
  4. java学习(97):中断线程的另一种处理
  5. 嵌入式开发中关键字_IO 和 volatile的用法
  6. CSS Grid布局(1)
  7. [机器学习笔记]Note7--神经网络:学习
  8. rfcv函数实现_JAVA_用_JCO连接_SAP,实现调用SAP_的_RFC_函数(整理)(附一篇看起来比较全面的说明)(JCO报错信息)...
  9. 智能机器人及其应用ppt课件_机器人视觉技术在建筑智能化生产中的应用
  10. Winfrom窗体应用程序___DataGridView