例子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 当函数模板遇上函数重载
#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次编译
在声明的地方对模板代码本身进行编译,在调用的地方对参数替换后的代码进行编译.
予人玫瑰,手有余香,小羊伴你一路同行~~~~