专业编程基础技术教程

网站首页 > 基础教程 正文

C++专题之函数模板(c++函数模版)

ccvgpt 2024-08-03 12:31:16 基础教程 13 ℃

例子1 为什么会有函数模板?

#include<iostream>
using namespace std;
//函数的业务逻辑一样,但是函数参数类型不一样
void myswaps01(int &a, int &b)
{

	int c = 0;
	c = b;
	a = b;
	b = c;

}
void myswaps02(char &a, char &b)
{

	char c = 0;
	c = b;
	a = b;
	b = c;

}
//让类型参数化,方便程序员编程-----泛型编程
//template告诉c++编译器,我要开始泛型编程了不要随便报错,看到T.
template <typename T>
void myswap(T &a, T &b)
{

	T c ;
	c = b;
	a = b;
	b = c;

}
//函数模板调用,显示调用   自动类型推导
void main()
{
	{
		int x = 10;
		int y = 20;
		myswap<int>(x, y);
		printf("x:%d y:%d\n", x, y);
	}

}
void main()
{

	{
		int x = 10;
		int y = 20;
		myswaps01(x, y);
		printf("x:%d y:%d\n", x, y);
	}
	char a = 'a';
	char b= 'b';
	myswaps02(a, b);
	printf("a:%d b:%d\n", a, b);
	system("pause");
	return;
}

例子2 当函数模板遇上函数重载

C++专题之函数模板(c++函数模版)

#include<iostream>
using namespace std;
//函数的业务逻辑一样,但是函数参数类型不一样
template <typename T>
void myswap(T &a, T &b)
{

	T c=0;
	c = b;
	a = b;
	b = c;
	cout << "hello....我是模板函数" << endl;

}
void myswap(int a, char c)
{

	cout << "a:" << a << "c:" << c << endl;
	cout << "hello....我是普通函数" << endl;
}
void main()
{

	int      a = 10;
	char     c = 'z';
	myswap(a, c);//普通函数调用:可以进行隐式的类型转换
	myswap(c, a);
	myswap(c, c);//调用函数模板(本质:类型参数化),将严格按照类型进行匹配,不会进行自动类型转换
	cout << "hello..." << endl;
	system("pause");
	return;

}

例子3 函数模板和普通函数在一起时的调用规则

#include<iostream>
using namespace std;
//函数模板的本质就是:类型函数参数化
template <typename T,typename T2>
int mySort(T *array, T2 size)
{
	T2 i, j;
	T tmp;
	if (array == NULL)
	{
		return -1;
	}
	for (i = 0; i < size; i++)
	{
		for (j = 0; j < size; j++)
		{
			if (array[i] < array[j])
			{
				tmp = array[i];
				array[i] = array[j];
				array[j] = tmp;
		     }
		
		}
	}

	return 0;

}
void main()
{


	{
		int myarray[11, 22, 33, 4, 55, 5, 6, 8, 334, 987];
		int size = sizeof(myarray) / sizeof(*myarray);
		mySort<int, int>(myarray, size);
		printf("排序之后\n");
		myPrint(myarray, size);
		cout << "hello..." << endl;
		system("pause");
		return;



	}
}

1函数模板不允许自动类型转换

2普通函数能够进行自动类型转换

3函数模板可以像普通函数一样被重载

4C++编译器优先考虑普通函数

5如果函数可以选择一个更好的匹配,那么选择模板

6如果可以通过空模板实参列表的语法限定编译器只能通过模板匹配

结论:编译器并不是把函数模板处理成能够处理任意类的函数

编译器从函数模板通过具体类型产生不同的函数,

编译器会对函数模板进行3次编译

在声明的地方对模板代码本身进行编译,在调用的地方对参数替换后的代码进行编译.

予人玫瑰,手有余香,小羊伴你一路同行~~~~

Tags:

最近发表
标签列表