【C++深度剖析教程38】类模板深度剖析
加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;
}
运行结果:
类模板特化注意事项:
- 特化,只是模板的分开实现
*本质上是同一个类模板 - 特化后的模板使用方式是统一的
*必须显示指定每一个类型参数
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、总结
- 类模板可以定义任意多个不同类型的参数
- 类模板可以被部分特化和完全特化
- 特化的本质是模板的分开实现
- 函数模板只支持完全特化
- 工程中一般使用模板特化代替(函数)重定义
【C++深度剖析教程38】类模板深度剖析相关推荐
- 【C++深度剖析教程39】实现C++数组类模板
上一篇文章在那个学习了多参数类模板与特化的分析:点击链接查看上一篇文章:类模板深度剖析 本篇文章学习记录: 数值型模板参数 实现C++数组类模板 1.模板中的数值型参数 模板参数可以是数值型参数.也就 ...
- 【C++深度剖析教程37】类模板的概念和意义
加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 1.类模板 一些类主要用于存储和组织数据元素 类中数据的组织方式和数据元素的具体类型无关 如 数组类,链表类,st ...
- 【C++深度剖析教程40】使用数值型模板技术计算1+2+3+...+N的值
上一篇文章学习了数值型模板技术,并利用相关技术,实现了C++的数组类模板.点击文章查看上一篇文章:点击链接查看 本篇文章,继续利用模板技术来解决一个问题. 如果想求1+2+3+-+N的结果,有很多种方 ...
- oak深度相机入门教程-多类语义分割
系列文章目录: oak深度相机入门教程-识别眼睛的凝视方向 oak深度相机入门教程-检测是否佩戴口罩 oak深度相机入门教程-文本检测+光学字符识别(OCR)管道 oak深度相机入门教程-识别人的 ...
- bert使用做文本分类_使用BERT进行深度学习的多类文本分类
bert使用做文本分类 Most of the researchers submit their research papers to academic conference because its ...
- Deep Learning 10_深度学习UFLDL教程:Convolution and Pooling_exercise(斯坦福大学深度学习教程)...
前言 理论知识:UFLDL教程和http://www.cnblogs.com/tornadomeet/archive/2013/04/09/3009830.html 实验环境:win7, matlab ...
- 真·干货!这套深度学习教程整理走红,从理论到实践的带你系统学习 | 资源...
铜灵 发自 凹非寺 量子位 出品 | 公众号 QbitAI 寒假/春节小长假给自己充电的真·干货来了. 如果你想要的是一份从理论到实践的深度学习教程清单,如果你想系统了解各类框架.基础网络与各种使用场 ...
- 【人工智能项目】深度学习实现10类猴子细粒度识别
[人工智能项目]深度学习实现10类猴子细粒度识别 任务说明 本次比赛需要选手准确识别10种猴子,数据集只有图片,没有boundbox等标注数据. 环境说明 !nvidia-smi Fri Mar 27 ...
- 深度学习教程(10) | 卷积神经网络解读(吴恩达·完整版)
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/35 本文地址:http://www.showmeai.tech/article-det ...
最新文章
- FT(Fourier Transform)在滤波上的应用
- c语言实现将两个文件复制到一个文件里_Python中复制文件的9种方法
- supersocket缓冲区_supersockets接收过滤器(ReceiveFilter)
- HDU - 5521 Meeting(最短路+思维建边)
- bootstrap 表格不用tr td如何写_Pandas还能用来写爬虫?
- dataframe的drop無效
- mysql heartbeat 慢_Mysql 慢日志优化分析方法
- java gson 工具类_GSON 实体 转换工具类
- 【华为云技术分享】用人工智能技术推动西安民俗文化,斗鱼超管团队有一套
- [verilog] 八位比较器
- 曹德旺的商业哲学:如果你对谁都不相信,必将一事无成
- gdb+openocd+stlink调试MCU
- 喵的Unity游戏开发之路 - 推球:游戏中的物理
- elasticsearch 拼音分词(elasticsearch-analysis-pinyin)
- 什么是QA?QA是什么意思?
- 麻进:这次不烧作品!
- 绘画语言的要素形状b节奏c立面d色彩,环境艺术设计理论考试题目资料.doc
- 用计算机术语赞美老师,赞美老师的句子
- CVS库,目录入库说明
- ATAT 报错Impossible to natch point correlations
热门文章
- 第一百二十八期:推荐几个IDEA插件,Java开发者撸码利器,你get到了吗
- spring学习(44):p名称空间注入
- spring学习(13):使用junit4进行单元测试续
- java学习(97):中断线程的另一种处理
- 嵌入式开发中关键字_IO 和 volatile的用法
- CSS Grid布局(1)
- [机器学习笔记]Note7--神经网络:学习
- rfcv函数实现_JAVA_用_JCO连接_SAP,实现调用SAP_的_RFC_函数(整理)(附一篇看起来比较全面的说明)(JCO报错信息)...
- 智能机器人及其应用ppt课件_机器人视觉技术在建筑智能化生产中的应用
- Winfrom窗体应用程序___DataGridView