模板特化

有些时候,我们写的模板不能满足所有类型的使用,所有我们在使用一些特殊类型的时候,先要手动给出该类型模板的代码,这就是模板特化。

模板参数在某种特定类型下的具体实现称为模板的特化

特化分类

  • 函数模板特化
  • 类模板特化
函数模板特化
template<typename T>
T Max(T t1,T t2)
{return (t1>t2)?t1:t2;
}
#define const char* ptemplate<>
p Max<p>(p t1,p t2)
{return (strcmp(t1,t2)>0)?t1:t2;
}

函数特化的语法:

  1. template<>
  2. 函数返回值 函数名<特化类型>(函数参数列表)

如果遇到不能特化的类型,最好是将其函数原原本本的写出来,避免特化时出现问题。

类特化
template<class T1,class T2>
class Test_Template
{public:Test_Template(){cout<<_data1<<_data2;}
private:T1 _data1;T2 _data2;
};

类特化分为两种:全特化、偏特化

  • 全特化:模板参数列表中的所有参数都给出。
template<class T1,class T2>
class Test_Template
{public:Test_Template(){cout<<_data1<<_data2;}
private:T1 _data1;T2 _data2;
};//全特化
template<>
//具体给出每个模板参数的类型
class Test_Template<string,string>
{public:Test_Template(){cout<<_data1<<_data2;}
private:T1 _data1;T2 _data2;
}
  • 偏特化分类

    • 部分偏特化(主要是参数个数)
    • 范围偏特化(参数类型为指针、引用类型)

部分偏特化
特化参数的个数小于模板参数的个数

//部分偏特化
template<class T2> //没有给出具体类型的模板参数
class Test_Template<string,T2>
{public:Test_Template(){cout<<_data1<<_data2;}
private:T1 _data1;T2 _data2;
}

范围偏特化

//范围偏特化,指针类型
template<class T1,class T2>
class Test_Template<T1*,T2*>
{public:Test_Template(){cout<<_data1<<_data2;}
private:T1 _data1;T2 _data2;
}
template<class T1,class T2)
class Test_Template<T1&,T2&>
{public:Test_Template(const T1& d1,const T2& d2):_data1(d1),_data2(d2){cout<<_data1<<_data2;}
private:T1& _data1;T2& _data2;
}
int main()
{Test_Template<string,string> t1;//全特化Test_Template<string,char> t2;//部分偏特化Test_Template<int&,int&> t3;//范围偏特化,引用版
}

C++---模板特化相关推荐

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

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

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

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

  3. C++ 函数模板特化导致的多重定义链接错误

    转载请注明文章:C++ 函数模板特化导致的多重定义链接错误 出处:多客博图 标题说的可能不是很清楚,解释一下,函数模板,一般都是放在头文件里面,所以有些时候,我也会做一个特化,也放在这个头文件里面,当 ...

  4. 类模板特化之经典(一)

    #include <iostream> using namespace std;template<int x> class sum {public:enum { number ...

  5. C++模板之隐式实例化、显示实例化、隐式调用、显示调用和模板特化详解

    模板的实例化指函数模板(类模板)生成模板函数(模板类)的过程.对于函数模板而言,模板实例化之后,会生成一个真正的函数.而类模板经过实例化之后,只是完成了类的定义,模板类的成员函数需要到调用时才会被初始 ...

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

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

  7. 函数模板、类模板(含模板特化)

    目录 一.函数模板 1.为什么要使用函数模板? 2.函数模板的定义及其使用 3.函数模板的实现原理 4.特例:同名非模板函数能和同名模板函数 同时存在 二.类模板 1.类模板格式 2.使用类模板创建对 ...

  8. C++ 模板特化与偏特化

    文章目录 1.模板特化 1.1 概述 1.2 函数模板特化 1.3 类模板特化 2.模板偏特化 2.1 概述 2.2 函数模板偏特化 2.3 类模板偏特化 3.模板类调用优先级 参考文献 1.模板特化 ...

  9. C++模板——模板特化、分离编译

    这里写目录标题 一.泛型编程与模板 二.函数模板 1.概念 2.原理 3.函数模板的实例化 3. 模板实现复数类的加法 4.模板参数的匹配原则 三.类模板 1.定义格式 用类模板实现顺序表 2.非类型 ...

最新文章

  1. 浅谈FIle协议与Http协议及区别
  2. Visual C++ 菜单
  3. UA MATH566 统计理论 QE练习题2.2
  4. 对于ARM的启动,系统升级,烧写过程和文件系统等方面的总结分析
  5. 切片[:, None, None]的含义
  6. 什么是Tomcat响应静态资源?
  7. Vue踩坑之旅(四)—— 自定义指令实现滚动加载
  8. 【Linux】用户与权限
  9. js 页面所有超链接后加随机数 基于jquery
  10. java treeset比较,java中TreeSet的两种排序比较的方式
  11. 医疗影像技术简介(X射线,CT,MRI等)
  12. ubuntu 10.04   花屏   启动缓慢   处理办法
  13. Form-Item Slot 自定义label内容
  14. AXURE 9 # 汉化教程
  15. 三张图看懂 clientheight、offsetheight、scrollheight
  16. natapp在linux服务器上的使用
  17. List数据去重的五种有效方法
  18. matlab画中国地图深浅,matlab画中国行政区划图/省界图(转)
  19. 体验与对比新版EBS gp3 vs gp2
  20. linux设备模型五(device和device_driver)

热门文章

  1. 跟着百度学PHP[13]-文件上传
  2. Codeforces Round #356 (Div. 1) D. Bear and Chase 暴力
  3. Ref_cursor
  4. 晚上无聊象征性收取了网友100元辛苦费,实现支持多语言功能的XML语言包版的C#的ASP.NET多语言支持例子程序...
  5. 【工程项目经验】github定位到历史版本(历史commit点)
  6. Overview of HEVC之4 帧内预测
  7. gradle打包web jar_Gradle构建SpringBoot并打包可运行的jar配置
  8. IntelliJ IDEA-遇见的问题总结
  9. javaweb(06) 初步了解HTTP协议
  10. hive 建表_Hive建表和内外部表的使用