C++---模板特化
模板特化
有些时候,我们写的模板不能满足所有类型的使用,所有我们在使用一些特殊类型的时候,先要手动给出该类型模板的代码,这就是模板特化。
模板参数在某种特定类型下的具体实现称为模板的特化
特化分类
- 函数模板特化
- 类模板特化
函数模板特化
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;
}
函数特化的语法:
- template<>
- 函数返回值 函数名<特化类型>(函数参数列表)
如果遇到不能特化的类型,最好是将其函数原原本本的写出来,避免特化时出现问题。
类特化
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++---模板特化相关推荐
- 模板特化,全特化,偏特化,全部特化,部分特化的含义
模板特化,任何针对模板参数进一步进行条件限制设计的特化版本.<泛型思维> 全特化就是全部特化,即针对所有的模板参数进行特化.<c++ primer> 偏特化就是部分特化,即针对 ...
- C++_模板特化(specialization),模板偏特化(局部特化)(partial specialization)
C++_模板特化(specialization),模板偏特化(局部特化)(partial specialization) 1.模板特化 函数模板也可以特化,特化要符合模板参数类型 2.模板偏特化(局部 ...
- C++ 函数模板特化导致的多重定义链接错误
转载请注明文章:C++ 函数模板特化导致的多重定义链接错误 出处:多客博图 标题说的可能不是很清楚,解释一下,函数模板,一般都是放在头文件里面,所以有些时候,我也会做一个特化,也放在这个头文件里面,当 ...
- 类模板特化之经典(一)
#include <iostream> using namespace std;template<int x> class sum {public:enum { number ...
- C++模板之隐式实例化、显示实例化、隐式调用、显示调用和模板特化详解
模板的实例化指函数模板(类模板)生成模板函数(模板类)的过程.对于函数模板而言,模板实例化之后,会生成一个真正的函数.而类模板经过实例化之后,只是完成了类的定义,模板类的成员函数需要到调用时才会被初始 ...
- C++——模板特化和偏特化
1.引言 C++中的模板分为类模板和函数模板,虽然它引进到C++标准中的时间不是很长,但是却得到了广泛的应用,这一点在STL中有着充分的体现.目前,STL在C++社区中得到了广泛的关注.应用和研究.理 ...
- 函数模板、类模板(含模板特化)
目录 一.函数模板 1.为什么要使用函数模板? 2.函数模板的定义及其使用 3.函数模板的实现原理 4.特例:同名非模板函数能和同名模板函数 同时存在 二.类模板 1.类模板格式 2.使用类模板创建对 ...
- C++ 模板特化与偏特化
文章目录 1.模板特化 1.1 概述 1.2 函数模板特化 1.3 类模板特化 2.模板偏特化 2.1 概述 2.2 函数模板偏特化 2.3 类模板偏特化 3.模板类调用优先级 参考文献 1.模板特化 ...
- C++模板——模板特化、分离编译
这里写目录标题 一.泛型编程与模板 二.函数模板 1.概念 2.原理 3.函数模板的实例化 3. 模板实现复数类的加法 4.模板参数的匹配原则 三.类模板 1.定义格式 用类模板实现顺序表 2.非类型 ...
最新文章
- 浅谈FIle协议与Http协议及区别
- Visual C++ 菜单
- UA MATH566 统计理论 QE练习题2.2
- 对于ARM的启动,系统升级,烧写过程和文件系统等方面的总结分析
- 切片[:, None, None]的含义
- 什么是Tomcat响应静态资源?
- Vue踩坑之旅(四)—— 自定义指令实现滚动加载
- 【Linux】用户与权限
- js 页面所有超链接后加随机数 基于jquery
- java treeset比较,java中TreeSet的两种排序比较的方式
- 医疗影像技术简介(X射线,CT,MRI等)
- ubuntu 10.04 花屏 启动缓慢 处理办法
- Form-Item Slot 自定义label内容
- AXURE 9 # 汉化教程
- 三张图看懂 clientheight、offsetheight、scrollheight
- natapp在linux服务器上的使用
- List数据去重的五种有效方法
- matlab画中国地图深浅,matlab画中国行政区划图/省界图(转)
- 体验与对比新版EBS gp3 vs gp2
- linux设备模型五(device和device_driver)
热门文章
- 跟着百度学PHP[13]-文件上传
- Codeforces Round #356 (Div. 1) D. Bear and Chase 暴力
- Ref_cursor
- 晚上无聊象征性收取了网友100元辛苦费,实现支持多语言功能的XML语言包版的C#的ASP.NET多语言支持例子程序...
- 【工程项目经验】github定位到历史版本(历史commit点)
- Overview of HEVC之4 帧内预测
- gradle打包web jar_Gradle构建SpringBoot并打包可运行的jar配置
- IntelliJ IDEA-遇见的问题总结
- javaweb(06) 初步了解HTTP协议
- hive 建表_Hive建表和内外部表的使用