C++中的模板template小结

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

函数模板

我们可以把函数模板当做一种特殊的函数,里面的参数类型可以是任意类型,这样的话我们就可以减少重复定义,从而让这个函数模板自动适应不同的参数类型,也就是说函数可以适应多种类型的参数,例如doubleint或者类什么的。

C++为了实现上面的功能,引入了template这个概念。我们可以把template当成是一种特殊的类型参数,并且也可以在函数里当做参数传递,心里面把它当做int什么的就行了。

使用类型参数声明函数模板的格式如下所示:

template <class identifier> function_declaration;
template <typename identifier> function_declaration; 
 // 这里使用了typename 当做声明类型参数

上面声明函数模板的格式只有一处不同,那就是classtypename,在这里其实使用哪一种都没有区别,看自己喜欢就行,C++对此也没有做严格的区分;

为了更好的说明如何使用函数模板,便在举一个很形象的例子,那就是一个用来返回较大值的函数,具体写法如下所示:

template <typename T>
T GetMax(T a, T b)
 return a > b ? a : b;

在上面的短短几行代码中我们就创建了一个函数模板用来获取两个数之间较大的那个数,不难看出T在这里并没有指明具体的类型,在这我们仍然可以在心里把它当做普通变量处理,返回值也是T。

为了使用我们定义的函数模板,可以参照统一的函数模板调用格式:

function_name<type> (parameters); 
// type就是具体的类型,例如int、double这些,parameters就是函数里的参数,也是具体类型

所以,如果我们想要实现获取两个整形值里较大的那个,我们可以传入int这个类型之后调用GetMax函数,具体示例如下:

int x = 4;
int y = 2;

int max = GetMax<int> (x, y); // max = 4

类模板

由于template声明的类型可以是任意类型,也就是使用的时候传入具体的类型就行。所以可以参考上面函数模板的例子构造类模板也是一样的,在使用这个类的时候传入具体的变量类型就行了。例如下面的类模板定义:

template <typename T>
class MyPair{
 T value[2];
 
 public:
  MyPair(T first, T second)
  {
   value[0] = first;
   value[1] = second;
  }
 };

类模板的示例代码中定义一个MyPair类,用来存储任意类型的两个元素,例如doublecharint等,下面我就给出两个示例,分别存储doubleint类型的变量

MyPair<int> myInt(2, 3); // 存储两个整型值
MyPair<double> myDouble(2.3, 3.43); // 存储两个double值