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

模板

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

大白话:C++是一门强类型语言,编写一段通用的逻辑,可以把任意类型的变量传进去处理,通过把通用逻辑设计为模板,摆脱了类型的限制,极大地提升了代码的可重用性。

**模板实例化:**模板定义本身不参与编译,而是编译器根据模板的用户使用模板时提供的类型参数生成代码,再进 行编译。用户提供不同的类型参数,就会实例化出不同的代码。


类模板

类模板描述了一组相关的类或数据类型,它们只能通过类型来区分:整数值、指向(或引用)具有全局链接的变量的指针、其他的组合。类模板尤其适用于描述通用但类型安全的数据结构。

类模板使用:

template <类型形式参数>class 类名{//类声明体;};template <类型形式参数>返回类型 类名 <类型> :: 成员函数名1(形式参数){//成员函数定义体;}... ...template <类型形式参数>返回类型 类名 <类型> :: 函数名N(形式参数){//成员函数定义体;}

案例:

#include <iostream>using namespace std;template<class T>
class Compare
{
public:bool equal(T a,T b);
};template<class T>
bool Compare<T>::equal(T a, T b)
{return a == b;
}int main()
{Compare<int>C;C.equal(1,2);return 0;
}

类模板全特化

所谓模板全特化限定死模板实现的具体类型;

比如上述这个例子,我们比较int类型这种还可以,但是比较float这种类型就不行,这时候就需要进行模板特化;

#include <iostream>using namespace std;template<class T>
class Compare
{
public:bool equal(T a,T b);
};template<class T>
bool Compare<T>::equal(T a, T b)
{return a == b;
}//模板全特化
template<>
class Compare<float>
{
public:bool equal(float a, float b);
};bool  Compare<float>::equal(float a, float b)
{return std::abs(a - b) < 10e-3;
}int main()
{Compare<int>C;cout<<C.equal(1,2)<<endl;Compare<float>C2;cout<<C2.equal(1.001,1.001)<<endl;return 0;
}

类模板偏特化

偏特化是指提供另一份template定义式,而其本身仍为templatized,这是针对于template参数更进一步的条件限制所设计出来的一个特化版本。也就是如果这个模板有多个类型,那么只限定其中的一部分;

#include <iostream>using namespace std;template<class T1,class T2>
class Test
{
public:Test(T1 a, T2 b):_a(a),_b(b){cout << "模板化" << endl;}
private:T1 _a;T2 _b;
};//模板全特化
template<>
class Test<int,int>
{
public:Test(int a, int b) :_a(a), _b(b){cout << "模板全特化" << endl;}
private:int _a;int _b;
};//模板偏特化
template<class T>
class Test<int,T>
{
public:Test(int a, T b) :_a(a), _b(b){cout << "模板偏特化" << endl;}
private:int _a;T _b;
};int main()
{Test<double, double> t1(1.01, 1.01);Test<int, int> t2(1, 1);Test<int, char*> t3(1, "111");return 0;
}

函数模板

函数模板一般定义:

template <类型形式参数>      //类型形式参数即此格式:<typename  形式参数>  或 <class 形式参数>
返回类型  函数名 (形式参数)
{//函数定义体;
}

案例:

#include <iostream>using namespace std;//普通模板
template<class T1,class T2>
bool Compare(T1 a, T2 b)
{return a == b;
}int main()
{cout << Compare(1, 2) << endl;return 0;
}

函数模板特化

函数模板特化和类模板特化本质是一样的,是对模板参数的特殊化处理:

#include <iostream>using namespace std;//普通模板
template<class T1,class T2>
bool Compare(T1 a, T2 b)
{cout << "普通模板" << endl;return a == b;
}//函数模板特化
template<>
bool Compare(const char* a, const char* b)
{cout << "函数模板特化" << endl;return strcmp(a,b) == 0;
}int main()
{cout << Compare(1, 2) << endl;cout << Compare("ab","ab") << endl;return 0;
}

总结

1、函数模板只有特化,没有偏特化;

2、模板、模板的特化和模板的偏特化都存在的情况下,编译器在编译阶段进行匹配,优先特殊的;

3、模板函数不能是虚函数;因为每个包含虚函数的类具有一个virtual table,包含该类的所有虚函数的地址,因此vtable的大小是确定的。模板只有被使用时才会被实例化,将其声明为虚函数会使vtable的大小不确定。所以,成员函数模板不能为虚函数。


C++ 模板 全特化与偏特化相关推荐

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

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

  2. 第十天2017/04/21(2、泛型编程:模板 / 全特化、偏特化)

    1.什么是模板? template<class T1,class T2,.....> 类属----类型参数化,又称参数模板使得程序可以从逻辑功能上抽象,把被处理的对象(数据)的类型作为参数 ...

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

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

  4. C/Cpp / STL / 模板全特化和偏特化

    栗子 #include <iostream>template <typename T1, typename T2> struct Test {void Print() { st ...

  5. [C++基础]034_C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)

    http://www.cnblogs.com/alephsoul-alephsoul/archive/2012/10/18/2728753.html 1.  主版本模板类 首先我们来看一段初学者都能看 ...

  6. C++ 模板的全特化与偏特化

    模板为什么要特化,因为编译器认为,对于特定的类型,如果你能对某一功能更好的实现,那么就该听你的. 模板分为类模板与函数模板,特化分为全特化与偏特化.全特化就是限定死模板实现的具体类型,偏特化就是如果这 ...

  7. Th4.6:模板全特化、偏特化(局部特化)详述

    本小节回顾的知识点分别是模板全特化.偏特化(局部特化). 今天总结的知识分为以下4个大点: (1)特化与泛化 (2)类模板特化     (2.1)类模板全特化         a)常规全特化      ...

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

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

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

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

最新文章

  1. 用计算机弹100万个可能,计算机应用基础试题与答案-2(选择题100道)(16页)-原创力文档...
  2. 练习题 James and Dominoes
  3. 【Linux】用户组、用户操作
  4. Matlab在概率统计中的应用问题及解决方案集锦
  5. 实验楼 “python3简明教程” 挑战三:玩转函数
  6. 「Android」 详细全面的基于vue2.0Weex接入过程(Android视角)
  7. c语言中获取用户控制台,【图片】【C语言】【控制台】提取腾讯通用户信息(id,用户名,手机)【erbi_lucifer吧】_百度贴吧...
  8. c语言2L,求助,R8C 2L 如何在C语言定位常数数组到绝对地址
  9. ssis 列转换_SSIS包中的行采样转换和百分比采样转换
  10. Spring MVC使用@RestController生成JSON示例
  11. 一寸照片像素是多少?教你一寸照片电子版怎么弄
  12. 软件工程-基本流程图
  13. html浏览xsd,那点你不知道的XHtml(Xml+Html)语法知识(DTD、XSD)
  14. websocket客户端与TCP服务器连接异常
  15. 1.DingoApi安装和配置
  16. 数据分析的数据来源都有哪些?
  17. 独立看门狗和窗口看门狗的区别
  18. n皇后问题回溯法-迭代实现
  19. Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile Package 7:lvm2-2
  20. vue 二维码+条形码识别

热门文章

  1. 7300 LE显卡只能使用VGA模式
  2. Sencha Touch 与 PhoneGap异同
  3. 如何通过二维码下载安卓软件(.APK文件)
  4. 解释器,一个交互式外壳
  5. RabbitMQ基础篇
  6. jstl 标签 循环 序号
  7. 前端之Angular2实战:Angular2语法清单
  8. angular2入门-第一个angular2 App
  9. 联想520r服务器装系统,联想Miix520本地模式重装win7系统教程
  10. 猎杀对决计算机丢失进不去,猎杀对决代码错误怎么解决 无法进入游戏解决方法...