欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++之模板

程序员文章站 2022-06-01 14:01:40
...

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;
}

函数模板的反汇编

C++之模板

普通函数的反汇编

C++之模板C++之模板

模板参数传递的是类型.

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

C++之模板

执行结果如下:

C++之模板

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;

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

C++之模板

发现错误如上.只有一个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;
}

修改代码如上,结果如下

C++之模板

显示实例化

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

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

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

上一篇: C++模板

下一篇: 分隔符组件