类模版1
2015-10-22 14:45
260 查看
全特化就是用一组确定的类型,对每一个模板参数进行特化:
template<typename A, typename B, typename C>
class X {...}; // (1)
template<>
class X<int, float, string> {...}; //(2)
当编译器遇到X<int, float, string>的模板实例化请求,则使用特化后的版本,即(2)。其他任何类型的组合都是用基本模板,即(1)
局部特化通常有两种基本情况:
1、对部分模板参数进行特化:
template<typename B, typename C>
class X<int, B, C> {...}; // (3)
当编译器遇到X<int, float, string>的模板实例化请求,使用这个特化的版本(3)。而当编译器遇到X<int, double, char>时,也是用这个特化版本。也就是说,只要X<>实例化时,第一个模板实参是int,就使用特化版本。
2、使用具有某一特征的类型,对模板参数进行特化:
template<typename T>
class Y {...}; //(4)
template<typename T>
class Y<T*> {...}; //(5)
当编译器遇到Y<int*>时,使用特化模板(5)。当编译器遇到T<float*>时,也使用特化模板(5)。而其他类型的实例化,如Y<int>则使用基本模板(4)。
也就是说,当模板实参符合特化版本所需的特征时,(在上面例子中是某个类型的指针),则使用特化版本。
这两种情况有时会混合使用,比如:
template<typename A, typename B>
class Z {...}; //(6)
template<typename A>
class Z<A&, char> {...}; //(7)
当编译器遇到Z<int&, char>或者Z<string&, char>时,使用特化模板(7)。其他情况使用基本模板(6),比如Z<int&, float>或Z<int, char>等等。
局部特化还有一种奇妙的用法:
template<typename T>
class F {...}; // (8)
template<typename R, typename P1, typename P2>
class F <R (*)(P1, P2)> {...}; // (9)
我们有函数:int f1(float a, double b);和string f2(int a, int b)。则如果我们使用这两个函数的指针实例化这个模板:F<f1>或F<f2>,
编译器就会使用特化版本(9)。也就是说,这里用一个有两个参数,并有返回值(参数和返回值的类型任意)的函数指针特化了F。这种形式可以引申到其他形式。这类特化方式的一个典型应用就是boost::function。
template<typename A, typename B, typename C>
class X {...}; // (1)
template<>
class X<int, float, string> {...}; //(2)
当编译器遇到X<int, float, string>的模板实例化请求,则使用特化后的版本,即(2)。其他任何类型的组合都是用基本模板,即(1)
局部特化通常有两种基本情况:
1、对部分模板参数进行特化:
template<typename B, typename C>
class X<int, B, C> {...}; // (3)
当编译器遇到X<int, float, string>的模板实例化请求,使用这个特化的版本(3)。而当编译器遇到X<int, double, char>时,也是用这个特化版本。也就是说,只要X<>实例化时,第一个模板实参是int,就使用特化版本。
2、使用具有某一特征的类型,对模板参数进行特化:
template<typename T>
class Y {...}; //(4)
template<typename T>
class Y<T*> {...}; //(5)
当编译器遇到Y<int*>时,使用特化模板(5)。当编译器遇到T<float*>时,也使用特化模板(5)。而其他类型的实例化,如Y<int>则使用基本模板(4)。
也就是说,当模板实参符合特化版本所需的特征时,(在上面例子中是某个类型的指针),则使用特化版本。
这两种情况有时会混合使用,比如:
template<typename A, typename B>
class Z {...}; //(6)
template<typename A>
class Z<A&, char> {...}; //(7)
当编译器遇到Z<int&, char>或者Z<string&, char>时,使用特化模板(7)。其他情况使用基本模板(6),比如Z<int&, float>或Z<int, char>等等。
局部特化还有一种奇妙的用法:
template<typename T>
class F {...}; // (8)
template<typename R, typename P1, typename P2>
class F <R (*)(P1, P2)> {...}; // (9)
我们有函数:int f1(float a, double b);和string f2(int a, int b)。则如果我们使用这两个函数的指针实例化这个模板:F<f1>或F<f2>,
编译器就会使用特化版本(9)。也就是说,这里用一个有两个参数,并有返回值(参数和返回值的类型任意)的函数指针特化了F。这种形式可以引申到其他形式。这类特化方式的一个典型应用就是boost::function。
相关文章推荐
- 深入块存储服务Cinder(转)
- ubuntu自带的ibus输入法问题解决方法
- myeclipse自动提示不起作用
- PG13阅读笔记
- [MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键
- 外媒:不应打击所有黑客 白帽黑客是车辆安全保护神
- 文件下载实现
- 关于java字符的编码问题学习
- 创建和销毁对象——避免创建不必要的对象——重用不可变对象(摘自Effective java)
- lua封装
- 关于视图控制器push or present...处理的相关
- \t 的理解
- vijosP1038 添加括号
- 文件下载实现
- Node之remove and clean
- Android内存管理整理
- 不同变量类型的不同输出格式
- MySql常用命令总结
- 类模版
- Java流--flush()