您的位置:首页 > 其它

类模版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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: