C++之模板

1、什么是模板? 
2、模板的原理? 
3、模板函数、模板类 
4、非类型模板参数 
5、特化--类型萃取 
6、模板的分离编译

1,什么叫做模板?

C++最重要的特性之一就是实现代码的重用.重用要求代码具有通用型.实现代码通用,不受数据类型的影响,就可以自动的使用数据类型的变化.这就是参数多态,它是通过模板实现的.

void swap(int* x, int* y)
{
	int tmp = *x;
	*x = *y;
	*y = tmp;
}
void swap(char* x, char* y)
{
	char tmp = *x;
	*x = *y;
	*y = tmp;
}
void swap(float* x, float* y)
{
	float tmp = *x;
	*x = *y;
	*y = tmp;
}

上面的三个函数的函数体相同,只是形参类型不同.可以利用重载和多态来实现,但是非常复杂繁琐.并且,如果定义了double类型的实参,调用函数就会出错.为了解决上述问题,C++机制引入了模板.

C语言支持两种模板类型:函数模板和类模板

函数模板可以用来创建一个通用功能的函数.以支持多种不同的形参.

函数模板格式

函数模板的一般形式如下:

template <class或者也可以用typename  形参名1,class 形参名2,class 形参名>

返回类型 函数名(形参表)
{//函数定义体 }

说明: template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,如果类型形参多余一个 ,每个形参前都要加class <类型 形参表>可以包含基本数据类型可以包含类类型.

template <class T>
void swap(T *x, T *y)
{
	T tmp = *x;
	*x = *y;
	*y = tmp;
}

函数模板的反汇编

普通函数的反汇编

模板参数传递的是类型.

函数模板如果没有实例化,不会生成实例化代码.因此编译器不会检查模板函数内部的语法,如下代码并未定义tmp直接使用,依然成功:

执行结果如下:

template<class T>
T compare(T x, T y)
{
	return x > y ? 0 : 1;
}cout << compare(1, 2) << endl;
cout << compare(1, 1.2) << endl;

对于上面的代码进行测试.

发现错误如上.只有一个T不能同时表示两种类型.

template<class T>
T compare(T x, T y)
{
	return x > y ? 0 : 1;
}
template<class T1,class T2>
T2 compare(T1 x, T2 y)
{
	return x > y?0 : 1;
}
int main()
{
	cout << compare(1, 2) << endl;
	//cout << compare(x, z) << endl;
	cout << compare<int,int>(1.5,1) << endl;
}

修改代码如上,结果如下

显示实例化

cout << compare<int,int>(1.5,1) << endl;

如果模板函数实例化的函数和已有的函数是同类函数,则编译器直接调用已有的函数,而不会重新实例化新的函数.

举个例子来说,假如要打扫卫生,如果已经有了扫把,就不会去买一把新的,直接使用已有的扫把,省时省心.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值