(函数/类模板)的(偏特化/全特化)
来源:互联网 发布:佛山淘宝培训班 编辑:程序博客网 时间:2024/04/27 13:57
特化的概念
特化,就是将泛型的东东搞得“具体化”一些,从字面上来解释,就是为已有的模板参数进行一些使其特殊化的指定,使得以前不受任何约束的模板参数,或受到特定的修饰或完全被指定了下来。
模板特化的分类
(1)针对特化的对象不同,分为两类:函数模板的特化和类模板的特化
全特化的标志:template <>然后是完全和模板类型没有一点关系的类实现或者函数定义。
全特化就是限定死模板实现的具体类型;
偏特化就是如果这个模板有多个类型,那么只限定其中的一部分。
全特化的标志:template <>
偏特化的标志:template <… …>
【说明】<>中写的是没有被特化的类型,举例子说明:
①如果<>里边是空的,则说明每个类型都被特化,因此就是全特化。
②如果<… …>里边不是空的,则… …就是没有被特化的类型
【注】
①模板函数只能全特化,没有偏特化(以后可能有);模板类是可以全特化和偏特化的。②全特化也就是定义了一个全新的类型,针对于类的全特化,“类中的函数”可以与模板类不一样
,也就是说生成了一个全新的类。
(2)针对特化的范围不同,分为两类:全特化和偏特化
偏特化:就是模板中的模板参数没有被全部确定,有部分参数类型需要编译器在编译时进行确定。
例1:函数模板的全特化
template <class T> //函数模板int compare(const T &left, const T&right){ std::cout <<"in template<class T>..." <<std::endl; return (left - right);}//函数模板的全特化代码见下面两种情况,一共有两种写法(这两种写法等价!)://写法一template < > int compare<const char*>(const char* left, const char* right){ std::cout <<"in special template< >..." <<std::endl; return strcmp(left, right);}//写法二template < > int compare(const char* left, const char* right){ std::cout <<"in special template< >..." <<std::endl; return strcmp(left, right);}
例2:类模板的偏特化
#include <iostream>#include <cstring>#include <cmath>//类模板Ttemplate<class T>class Compare{public: static bool IsEqual(const T& lh, const T& rh) { std::cout <<"in the general class..." <<std::endl; return lh == rh; }};//类模板的全特化floattemplate<>class Compare<float>{public: static bool IsEqual(const float& lh, const float& rh) { std::cout <<"in the float special class..." <<std::endl; return std::abs(lh - rh) < 10e-3; }};//类模板的全特化doubletemplate<>class Compare<double>{public: static bool IsEqual(const double& lh, const double& rh) { std::cout <<"in the double special class..." <<std::endl; return std::abs(lh - rh) < 10e-6; }};【注】调用准则:先去全特化、偏特化中寻找匹配的函数;若找不到再去模板函数中去寻找。int main(void){ Compare<int> comp1; std::cout <<comp1.IsEqual(3, 4) <<std::endl; std::cout <<comp1.IsEqual(3, 3) <<std::endl; Compare<float> comp2; std::cout <<comp2.IsEqual(3.14, 4.14) <<std::endl; std::cout <<comp2.IsEqual(3, 3) <<std::endl; Compare<double> comp3; std::cout <<comp3.IsEqual(3.14159, 4.14159) <<std::endl; std::cout <<comp3.IsEqual(3.14159, 3.14159) <<std::endl; return 0;}
例3:类模板的偏特化
//类模板T1、T2template<class T1, class T2>class A{}//类模板的偏特化T1, inttemplate<class T1>class A<T1, int>{}
【综合示例】
template<typename T1, typename T2> class Test { public: Test(T1 i,T2 j):a(i),b(j){cout<<"模板类"<<endl;} private: T1 a; T2 b; }; template<> class Test<int , char> { public: Test(int i, char j):a(i),b(j){cout<<"全特化"<<endl;} private: int a; char b; }; template <typename T2> class Test<char, T2> { public: Test(char i, T2 j):a(i),b(j){cout<<"偏特化"<<endl;} private: char a; T2 b; }; //那么下面3句依次调用类模板、全特化与偏特化:Test<double , double> t1(0.1,0.2); Test<int , char> t2(1,'A'); Test<char, bool> t3('A',true);
例4:函数模板的偏特化
而对于函数模板:只有全特化,不能偏特化!
//模板函数template<typename T1, typename T2>void fun(T1 a , T2 b){ cout<<"模板函数"<<endl;}//全特化template<>void fun<int ,char >(int a, char b){ cout<<"全特化"<<endl;}//函数不存在偏特化:下面的代码是错误的/*template<typename T2>void fun<char,T2>(char a, T2 b){ cout<<"偏特化"<<endl;}*/
1 0
- (函数/类模板)的(偏特化/全特化)
- 类模板的 全特化、偏特化
- 函数模板全特化与偏特化
- 模板的特化(特化和偏特化)
- 函数模板全特化与特殊的偏特化
- 模板的全特化与偏特化
- 模板的全特化与偏特化
- 模板的全特化与偏特化
- 模板的全特化与偏特化
- 模板的全特化与偏特化
- 模板的全特化与偏特化
- 模板特化,全特化,偏特化,全部特化,部分特化
- 类模板的全特化和偏特化
- 模板特化,全特化,偏特化,全部特化,部分特化的含义
- 模板函数和类的特化以及偏特化
- [C++基础]034_C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)
- [C++基础]034_C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)
- 类模板的特化和偏特化
- 332. Reconstruct Itinerary
- 关于Spring开启事务的错误
- git工具使用
- 【面试】sizeof 三原则
- Treap-总结
- (函数/类模板)的(偏特化/全特化)
- 对已知数组进行编号
- 生理周期_POJ
- 基本语言(一)
- 对,是form表单
- 系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式
- word更新目录域宏命令
- caffe学习笔记25-过拟合原因及分析
- struts2值栈没有数据的问题