1.函数模板
函数模板的声明和模板函数的生成
函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免函数体的重新设计,它的最大特点是把函数使用的数据类型作为参数
声明:
template<typename 数据类型参数标识符>
返回类型 函数名 (参数表)
{
函数体
}
其中,template是定义模板函数的关键字;template后面的尖括号不能省略;typename(或class)是声明数据类型参数标识符的关键字,用以说明它后面的标识符是数据类型标识符。这样,在以后定义的这个函数中,凡希望根据实参数据类型来确定数据类型的变量,都可以用数据类型参数标识符来说明,从而使这个变量可以适应不同的数据类型。
函数模板只是声明了一个函数的描述即模板,不是一个可以直接执行的函数,只有根据实际情况用实参的数据类型代替类型参数标识符之后,才能产生真正的函数。
函数模板允许使用多个类型参数,但在template定义部分每个形参前必须有关键字typename或class
template<class 数据类型参数标识符1, class 数据类型参数标识符2,...>
返回类型 函数名(参数表)
{
函数体
}
在template语句与函数模板定义语句<返回类型>之间不允许有别的语句,否则会报错。模板函数类似于重载函数,但是两者有很大区别:函数重载时,每个函数体内部可以执行不同的动作,但是同一个模板实例化后的模板函数都必须执行相同的动作。
2.类模板
c++中将模板的思想应用于类,使得类的实现不关注数据元素的具体类型,而只关注类所需要实现的功能。就是以相同的方式处理不同的类型,摘自https://blog.csdn.net/small_prince_/article/details/80533105和http://c.biancheng.net/view/320.html
c++中类模板的写法如下
template <类型参数表>
class 类模板名
{
成员变量和成员函数
};
类型参数表的写法如下:
class 类型参数1, class 类型参数2,...
或者
typename 类型参数1, typename 类型参数2,...
类模板中的成员函数放在类模板定义外面写时的语法:
template <类型参数表>
返回值类型 类模板名<类型参数名列表>::成员函数名(参数表)
{
...
}
使用类模板定义对象的写法:
类模板名 <真实类型参数表> 对象名(构造函数实际参数表)
如果类模板有无参数构造函数,那么也可以使用如下写法:
类模板名<真实类型参数表>对象名;
以pair类模板来说明类模板的写法和用法
#include<iostream>
#include<string>
using namespace std;
template<class T1, class T2>
class Pair
{
public:
T1 key; //关键字
T2 value; //值
Pair(T1 k, T2 v):key(k),value(v) { };
bool operator < (const Pair<T1, T2> &p)const;
};
template<class T1, class T2>
bool Pair<T1, T2>::operator < (const Pair<T1, T2> &p) const
{
return key < p.key;
}
int main()
{
Pair<string, int>student("Tom", 19);
cout << student.key << " " << student.value << endl;
return 0;
}
输出:
函数模板作为类模板成员:类模板中的成员函数还可以是一个函数模板,成员函数模板只有在被调用时才会被实例化。
#include<iostream>
#include<string>
using namespace std;
template<class T>
class Output
{
public:
template<class T1>
void print(T1 t) {
cout << t << endl;
return ;
}
};
int main()
{
Output<int>a;
a.print("Hello World!");
return 0;
}
来源:CSDN
作者:axiaobingqiu
链接:https://blog.csdn.net/ab1605014317/article/details/103569699