c++模板

心已入冬 提交于 2019-12-17 04:26:48

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/80533105http://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;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!