模板类的全特化、偏特化
时间:2014-04-28 08:02:07
收藏:0
阅读:749
我们先来定义一个普通的模板类
1 template<class T> 2 struct Test 3 { 4 Test(){ cout << "模板类" << endl; } 5 };
我们再来调用一下:
1 int main() 2 { 3 Test<char> t1; 4 Test<int> t2; 5 Test<int *> t3; 6 return 0; 7 }
输出的结果1:
模板类
模板类
模板类
如果我们这样写,再增加一个模板类
1 template<class T> 2 struct Test 3 { 4 Test(){ cout << "模板类" << endl; } 5 }; 6 7 template<> 8 struct Test<int> 9 { 10 Test(){ cout << "全特化" << endl; } 11 };
再来调用一下,调用代码同上!
输出的结果2:
模板类
全特化
模板类
其中template<>开头的模板类就是全特化的模板类,根据全特化模板的定义就知道,全特化的时候没有类型参数,即template<(这里是空)>。由于全特化版本的模板类与Test<int> t2;调用时更接近,所以会用这个模板来实例化一个类。
那什么是偏特化模板类,先看如下定义:
1 template<class T> 2 struct Test 3 { 4 Test(){ cout << "模板类" << endl; } 5 }; 6 7 template<> 8 struct Test<int> 9 { 10 Test(){ cout << "全特化" << endl; } 11 }; 12 13 template<class T> 14 struct Test<T*> 15 { 16 Test(){ cout << "偏特化" << endl;} 17 };
再次调用,输出结果3:
模板类
全特化
偏特化
我们看一下,第三个模板类的定义,会发现它很特别,它既有类型参数。但又需要对其进行特化(这里是特化成指针类型),当你给的是指针类型的时候,会调用这个模板,而不是普通模板。这就是部分特化,也称偏特化。有的人可能会想到,我这样写不也行么:
template<class T*> struct Test { Test(){ cout << "型别是指针!" << endl;} };
对不起,这段代码通过不了编译!所以必须要用到偏特化!当然,我上面写的是偏特化的一种,当这样的时候也是偏特化:
template<class T> struct Test<int,T> { }
这个偏特化的例子中,一个参数被绑定到int类型,而另一个参数仍未绑定需要由用户指定。这也是偏特化。而且更好理解!
评论(0)