目录

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++_模板全特化、偏特化相关推荐

  1. 模板 泛化 全特化 偏特化

    template<>出现,就表示要特化了 为什么要特化呢?泛化不就是为了解决数据类型不一致吗? 泛化是通用,特化是优化,缺一不可 特化,又被成为全特化 full-specializatio ...

  2. 操作符重载and模板(泛化, 全特化, 偏特化)

    模板 Header(头文件)中的防卫式声明.布局 // complex.h// guard 防卫式声明 #ifndef __COMPLEX__ #define __COMPLEX__// 0.forw ...

  3. (函数/类模板)的(偏特化/全特化)

    特化的概念 特化,就是将泛型的东东搞得"具体化"一些,从字面上来解释,就是为已有的模板参数进行一些使其特殊化的指定,使得以前不受任何约束的模板参数,或受到特定的修饰或完全被指定了下 ...

  4. C++ 模板 全特化与偏特化

    C++ 模板 全特化与偏特化 模板 模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性.模版可以分为两类,一个是函数模版,另外一个是 ...

  5. C++模板的全特化和偏特化

    C++模板的全特化与偏特化 全特化 偏特化 例子 总结 全特化 全特化一般用于处理有特殊要求的类或者函数,此时依靠泛型模板无法处理这种情况.,因此全特化可以运用在类模板和函数模板当中.其模板参数列表为 ...

  6. C++ 模板偏特化-来自STL的思考

    之前学习STL时接触过一段时间的模板,模板是C++泛型编程编程的基础 STL从头到尾都是模板泛型编程,我觉得用的最巧妙的就是在traits萃取技巧时用到的模板偏特化 先简要回顾一下模板吧,模板主要分为 ...

  7. 【C++模板】特化与偏特化 template [partial] specialization

    1 template specialization 模板特化 一般情况下类模板定义如下: template<class Window, class Controller> class Wi ...

  8. C++——模板特化和偏特化

    1.引言 C++中的模板分为类模板和函数模板,虽然它引进到C++标准中的时间不是很长,但是却得到了广泛的应用,这一点在STL中有着充分的体现.目前,STL在C++社区中得到了广泛的关注.应用和研究.理 ...

  9. 模板特化,全特化,偏特化,全部特化,部分特化的含义

    模板特化,任何针对模板参数进一步进行条件限制设计的特化版本.<泛型思维> 全特化就是全部特化,即针对所有的模板参数进行特化.<c++ primer> 偏特化就是部分特化,即针对 ...

  10. C++_模板特化(specialization),模板偏特化(局部特化)(partial specialization)

    C++_模板特化(specialization),模板偏特化(局部特化)(partial specialization) 1.模板特化 函数模板也可以特化,特化要符合模板参数类型 2.模板偏特化(局部 ...

最新文章

  1. 【跟着子迟品 underscore】Array Functions 相关源码拾遗 小结
  2. win10启动修复_win10下以安全模式启动电脑全攻略,装机、修复电脑故障必备
  3. 等价类划分应用的扩展
  4. 雪儿--北京欢迎你!!!
  5. 递归算法题解析:设m,n均为自然数,m可表示为一些不超过n的自然数之和,f(m,n)为这种表示方式的数目
  6. windows下面sublime无法粘贴复制的问题解决(转)
  7. c语言以顺序结构存储的二叉树的非递归遍历,C语言二叉树的非递归遍历实例分析...
  8. C Builder中如何利用消息
  9. pyqt5 不报错退出_Python学习之旅:使用virtualenv创建Python环境及PyQT5环境配置
  10. 周学习进度---05
  11. Javascript实现鼠标框选元素后拖拽被框选的元素
  12. 整理一下N年前写的java web考勤管理系统
  13. 给扔物线 HenCoder Plus 学员的一次分享文字版
  14. 不允许有匹配 [xX][mM][lL] 的处理指令目标
  15. 前端登陆界面 html+js
  16. 如何在BIOS中设置RAID?
  17. SpringBoot与Loki的那些事
  18. traceroute的一些用法
  19. 10组团队项目-Alpha冲刺-2/6
  20. linux禁用usb的命令,禁用linux中的usb端口

热门文章

  1. MySQL视图和事务
  2. Nginx: 解决connect() to xxxx failed (13: Permission denied) while connecting to upstream的问题
  3. 网络安全态势感知(NSSA)----引言
  4. 【iCore4 双核心板_ARM】例程十四:FATFS实验——文件操作
  5. iOS----集成ijkplayer视频直播
  6. 8.确保0对于值类型是有效的
  7. 汇编语言的强制类型转换
  8. 21.Shiro在springboot与vue前后端分离项目里的session管理
  9. 剪贴板增强工具 Ditto
  10. VS2015 编译libevent库