C++_模板全特化、偏特化
目录
1. C++模板
2. C++模板全特化
3. C++模板偏特化
4. 模板类调用优先级
1. C++模板
大家都对C++的模板编程应该都能很熟练使用了,下面就是一段很简单不过的例子了
//模板函数
template<typename T, class N> void func(T num1, N num2)
{cout << "num1:" << num1 << ", num2:" << num2 <<endl;
}//模板类
template<typename T, class N> class Test_Class
{static bool comp(T num1, N num2){return (num1<num2)?true:false;}
};
2. C++模板全特化
特化其实就是特殊化的意思,在模板类里,所有的类型都是模板(template<class T>),而一旦我们将所有的模板类型T都明确化,并且写了一个类名与主模板类名相同的类,那么这个类就叫做全特化类。C++模板全特化之后已经失去了Template的属性了。
示例
//模板函数
template<typename T, class N> void func(T num1, N num2)
{//cout << "num1:" << num1 << ", num2:" << num2 <<endl;
}//模板类
template<typename T, class N> class Test_Class
{
public:static bool comp(T num1, N num2){return (num1<num2)?true:false;}
};//全特化,模板函数
template<> void func(int num1, double num2)
{cout << "num1:" << num1 << ", num2:" << num2 <<endl;
}//全特化,模板类
template<> class Test_Class<int, double>
{
public:static bool comp(int num1, double num2){return (num1<num2)?true:false;}
};//调用func<int, double>(1, 2.0);
Test_Class<int, double>::comp(1, 2.0);
注意:一个模板被称为全特化的条件:1.必须有一个主模板类 2.模板类型被全部明确化
3. C++模板偏特化
上面对主版本模板和全特化进行了定义,那么偏特化就是介于二者之间的模板,它的模板名与主版本模板名相同,但是它的模板型中,有被明确化的部分和没有被明确化的部分。
示例
//模板函数
template<typename T, class N> void func(T num1, N num2)
{//cout << "num1:" << num1 << ", num2:" << num2 <<endl;
}//模板类
template<typename T, class N> class Test_Class
{
public:static bool comp(T num1, N num2){return (num1<num2)?true:false;}
};//偏特化,模板函数
template<class N> void func(int num1, N num2)
{cout << "num1:" << num1 << ", num2:" << num2 <<endl;
}//偏特化,模板类
template<class N> class Test_Class<int, N>
{
public:static bool comp(int num1, double num2){return (num1<num2)?true:false;}
};//调用func<int, double>(1, 2.0);
Test_Class<int, double>::comp(1, 2.0);
注意:偏特化的条件:1.必须有一个主模板 2.模板类型被部分明确化
4. 模板类调用优先级
对主版本模板类、全特化类、偏特化类的调用优先级从高到低进行排序是:全特化类>偏特化类>主版本模板类。这样的优先级顺序对性能也是最好的。
但是模板特化并不只是为了性能优化,更多是为了让模板函数能够正常工作,最典型的例子就是STL中的iterator_traits。algorithm中大多数算法通过iterator对象来处理数据,但是同时允许以指针代替iterator对象,这是为了支持C-Style Array。如果直接操作iterator,那么为了支持指针类型,每个函数都需要进行重载,因为指针没有::value_type类型。为了解决这个问题,STL使用了iterator_traits,并为指针类型进行转化,算法通过它来操作iterator,不需要知道实际操作的是iterator对象还是指针。
template<typename IteratorClass> class iterator_traits
...
template<typename ValueType> class iterator_traits<ValueType*>
...
template<typename ValueType> class iterator_traits<ValueType const*>
后面两是针对指针类型的偏特化,也是偏特化的一种常见形式。
C++_模板全特化、偏特化相关推荐
- 模板 泛化 全特化 偏特化
template<>出现,就表示要特化了 为什么要特化呢?泛化不就是为了解决数据类型不一致吗? 泛化是通用,特化是优化,缺一不可 特化,又被成为全特化 full-specializatio ...
- 操作符重载and模板(泛化, 全特化, 偏特化)
模板 Header(头文件)中的防卫式声明.布局 // complex.h// guard 防卫式声明 #ifndef __COMPLEX__ #define __COMPLEX__// 0.forw ...
- (函数/类模板)的(偏特化/全特化)
特化的概念 特化,就是将泛型的东东搞得"具体化"一些,从字面上来解释,就是为已有的模板参数进行一些使其特殊化的指定,使得以前不受任何约束的模板参数,或受到特定的修饰或完全被指定了下 ...
- C++ 模板 全特化与偏特化
C++ 模板 全特化与偏特化 模板 模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性.模版可以分为两类,一个是函数模版,另外一个是 ...
- C++模板的全特化和偏特化
C++模板的全特化与偏特化 全特化 偏特化 例子 总结 全特化 全特化一般用于处理有特殊要求的类或者函数,此时依靠泛型模板无法处理这种情况.,因此全特化可以运用在类模板和函数模板当中.其模板参数列表为 ...
- C++ 模板偏特化-来自STL的思考
之前学习STL时接触过一段时间的模板,模板是C++泛型编程编程的基础 STL从头到尾都是模板泛型编程,我觉得用的最巧妙的就是在traits萃取技巧时用到的模板偏特化 先简要回顾一下模板吧,模板主要分为 ...
- 【C++模板】特化与偏特化 template [partial] specialization
1 template specialization 模板特化 一般情况下类模板定义如下: template<class Window, class Controller> class Wi ...
- C++——模板特化和偏特化
1.引言 C++中的模板分为类模板和函数模板,虽然它引进到C++标准中的时间不是很长,但是却得到了广泛的应用,这一点在STL中有着充分的体现.目前,STL在C++社区中得到了广泛的关注.应用和研究.理 ...
- 模板特化,全特化,偏特化,全部特化,部分特化的含义
模板特化,任何针对模板参数进一步进行条件限制设计的特化版本.<泛型思维> 全特化就是全部特化,即针对所有的模板参数进行特化.<c++ primer> 偏特化就是部分特化,即针对 ...
- C++_模板特化(specialization),模板偏特化(局部特化)(partial specialization)
C++_模板特化(specialization),模板偏特化(局部特化)(partial specialization) 1.模板特化 函数模板也可以特化,特化要符合模板参数类型 2.模板偏特化(局部 ...
最新文章
- 【跟着子迟品 underscore】Array Functions 相关源码拾遗 小结
- win10启动修复_win10下以安全模式启动电脑全攻略,装机、修复电脑故障必备
- 等价类划分应用的扩展
- 雪儿--北京欢迎你!!!
- 递归算法题解析:设m,n均为自然数,m可表示为一些不超过n的自然数之和,f(m,n)为这种表示方式的数目
- windows下面sublime无法粘贴复制的问题解决(转)
- c语言以顺序结构存储的二叉树的非递归遍历,C语言二叉树的非递归遍历实例分析...
- C Builder中如何利用消息
- pyqt5 不报错退出_Python学习之旅:使用virtualenv创建Python环境及PyQT5环境配置
- 周学习进度---05
- Javascript实现鼠标框选元素后拖拽被框选的元素
- 整理一下N年前写的java web考勤管理系统
- 给扔物线 HenCoder Plus 学员的一次分享文字版
- 不允许有匹配 [xX][mM][lL] 的处理指令目标
- 前端登陆界面 html+js
- 如何在BIOS中设置RAID?
- SpringBoot与Loki的那些事
- traceroute的一些用法
- 10组团队项目-Alpha冲刺-2/6
- linux禁用usb的命令,禁用linux中的usb端口
热门文章
- MySQL视图和事务
- Nginx: 解决connect() to xxxx failed (13: Permission denied) while connecting to upstream的问题
- 网络安全态势感知(NSSA)----引言
- 【iCore4 双核心板_ARM】例程十四:FATFS实验——文件操作
- iOS----集成ijkplayer视频直播
- 8.确保0对于值类型是有效的
- 汇编语言的强制类型转换
- 21.Shiro在springboot与vue前后端分离项目里的session管理
- 剪贴板增强工具 Ditto
- VS2015 编译libevent库