C++中的模板template小结

2020-03-19 12:01:11王冬梅

模板类的成员函数也可以在类外定义,写法和函数模板的写法是一样的,具体示例如下所示:

template <class T>
class MyPair {
 T a, b;
 public:
 mypair (T first, T second)
  {a=first; b=second;}
 T Getmax ();
};

template <typename T>
T MyPair<T>::Getmax () // 在类外定义函数, 注意前面的写法和函数模板写法一致
{
 T retval;
 retval = a>b? a : b;
 return retval;
}

模板特化

如果我们想要为类模板定义一个不同的实现接口,并且要求需要将特定参数作为参数传递时,那么我们就可以将该模板特化;

为了更好地说明模板特化,还是举个简单的例子吧。假设我们定义一个类mycontainer,这个类可以存储一个任意类型的变量,并且这个类还有一个函数叫做increasement用来将存储的类型加一。并且,如果这个类存储的是一个char类型的时候,我们会发现这个类对于实现将其中的成员变量转换为大写的功能将更加方便,不妨将这个函数定义为ToUpper,因此,我们可以为char类型的类模板实现模板特化,具体的示例代码如下:

// 模板特化
#include <iostream>
using namespace std;

// 声明类模板:
template <typename T>
class mycontainer {
 T element;
 public:
 mycontainer (T arg) {element=arg;}
 T increase () {return ++element;}
};

// char类型的模板特化:
template <>
class mycontainer<char> {
 char element;
 public:
 mycontainer(char arg) {element=arg;}
 
 char ToUpper()
 {
  if ((element>='a')&&(element<='z'))
  element+='A'-'a';
  return element;
 }
};

对于上面的模板特化,我们需要几点,注意类模板和模板特化的区别和联系:

在类模板的前面加上template <>,这表明是模板特化,也就是是说模板特化都需要加上这句话; 还有一点就是类模板后面使用了<char>参数,这个特定参数表示我们将模板类特化程<char>类型;

template的其他用法

除了以template或者class关键字开头声明的表示类型的模板参数之外,template也可以具有其他类型的参数,例如intdouble这些参数,就类似于一个函数中拥有多个参数,每个参数类型还不一样。为了更好的说明template的其他用法,不妨参考下面的示例代码,

#include <iostream>
using namespace std;

template<class T, int N> // 这里除了含有class声明的类型之外,还拥有一个int类型
class mysequence {
 T memblock [N];
 public:
 void setmember(int x, T value);
 T getmember(int x);
};

template<class T, int N>
void mysequence<T,N>::setmember(int x, T value) {
 memblock[x]=value;
}

template<class T, int N>
T mysequence<T,N>::getmember(int x) {
 return memblock[x];
}

int main(){
 mysequence<int,5> myints;
 mysequence<double,5> myfloats;
 myints.setmember(0,100);
 myfloats.setmember(3,3.1416);
 cout << myints.getmember(0) << 'n';
 cout << myfloats.getmember(3) << 'n';
 return 0;
}