模版特化与偏特化

2014-09-18  本文已影响1314人  eesly_yuan

内容来自

一是特化为绝对类型; 二是特化为引用,指针类型;三是特化为另外一个类模板。

template <class T>
T mymax(const T t1, const T t2){   
return t1 < t2 ? t2 : t1;
}
template <>
const char* mymax(const char* t1,const char* t2){
   return (strcmp(t1,t2) < 0) ? t2 : t1;
}
但是你不能这么搞:
template <>
bool mymax(const char* t1,const char* t2){
   return (strcmp(t1,t2) < 0);
}

模板的特化
template <class T>
class stack {};
template < >
class stack<bool> { //…// };

上述定义中template < >告诉编译器这是一个特化的模板。

main()
{
  int highest = mymax(5,10);
  char c = mymax(‘a’, ’z’);
  const char* p1 = “hello”;
  const char* p2 = “world”;
  const char* p = mymax(p1,p2);
}

前面两个mymax都能返回正确的结果.而第三个却不能,因为,此时mymax直接比较两个指针p1 和 p2 而不是其指向的内容.针对这种情况,当mymax函数的参数类型为const char* 时,需要特化。

template <class T>
T mymax(const T t1, const T t2)
{
   return t1 < t2 ? t2 : t1;
}
template <>
const char* mymax(const char* t1,const char* t2)
{
   return (strcmp(t1,t2) < 0) ? t2 : t1;
}

现在mymax(p1,p2)能够返回正确的结果了。


模板的偏特化

模板的偏特化是指需要根据模板的某些但不是全部的参数进行特化

template <class T, class Allocator>
class vector { // … // };
template <class Allocator>
class vector<bool, Allocator> { //…//};

这个偏特化的例子中,一个参数被绑定到bool类型,而另一个参数仍未绑定需要由用户指定。

  template <class T> void f(T);  (a)
  根据重载规则,对(a)进行重载
  template < class T> void f(T\*);  (b)

如果将(a)称为基模板,那么(b)称为对基模板(a)的重载,而非对(a)的偏特化。C++的标准委员会仍在对下一个版本中是否允许函数模板的偏特化进行讨论。


模板特化时的匹配规则
template <class T> class vector{//…//}; // (a)  普通型
template <class T> class vector<T*>{//…//};  // (b) 对指针类型特化
template <>   class vector <void*>{//…//};  // (c) 对void*进行特化

每个类型都可以用作普通型(a)的参数,但只有指针类型才能用作(b)的参数,而只有void*才能作为(c)的参数

上一篇 下一篇

猜你喜欢

热点阅读