模板分为函数模板与类模板
语法:template < typename T>
template 声明这是在创建模板
typename 表示后面的符号是一种数据类型,习惯上,如果声明类模板,则template < class T>,除了名字,没有什么不同
对于函数,例如 void funct(int a)中 void函数返回值类型与int参数类型可以先不指定
一、使用方法:
举例:
int addIn(int &m,int &n) //两整型数相加
{
int val = m+n;
return val ;
}
double addFloat(double &m,double &n)//两浮点型数相加
{
double val = m+n;
return val ;
}
可以发现,上面两个函数实现的功能都是一样,只有参数类型以及返回值类型不一样;所以可以换成函数模板实现:
template <typename T>
T myadd(T &m,T &n)
{
T val = m+n;
return val;
}
使用方式如下:
①不指定模板参数类型
int m = 12,;
int n = 13;
int recVal = 0;
recVal = myadd(m, n);
经测试 可以正常运行。但是,注意:这种方式必须有一致的数据类型T,如果上述的m和n的数据类型不一样,则报错,即不能进行类型转换。例如:
int m = 12;
double n = 13.0;
int recVal = 0;
recVal = myadd(m, n);
②指定模板参数类型
recVal = myadd<int>(m, n);
cout << recVal << endl;
二、普通函数与函数模板的区别:
普通函数可以自动进行类型转换,而函数模板只有在指定类型时才可以进行类型转换,在不指定模板类型时不能发生类型转换,如上面①所示的情况。
举例:
Ⅰ、普通函数:
int add(int a,int b)
{
return a+b;
}
传参时:
int m = 10;
char n = 'a'; //注意n是字符型
cout << add(m, n) << endl;
不会报错,会将char转换为ASCII码整型数据,最终输出的结果是107.
Ⅱ、函数模板在指定类型时:
template <typename T>
T add(T a, T b)
{
return a + b;
}
传参时:
int m = 10;
char n = 'a'; //注意n是字符型
cout << add<int>(m, n) << endl;
也不会报错,会将char转换为ASCII码整型数据,最终输出的结果是107.
三、普通函数与函数模板的调用规则
当普通函数与函数模板都存在的情况下,优先调用普通函数,如果一定要调用函数模板,可以使用空模板参数列表来强制调用函数模板
1、优先调用普通函数
//普通函数
void myTest(int m,int n)
{
cout << "调用普通函数"<< endl;
}
//函数模板
template <typename T>
void myTest(T m,T n)
{
cout << "调用模板函数"<< endl;
}
调用时:
myTest(10,20);
经过测试,可以发现调用的是普通函数。
2、在上面“1、优先调用普通函数”的情况下如何强制调用函数模板
使用空模板参数列表:
//普通函数
void myTest(int m,int n)
{
cout << "调用普通函数"<< endl;
}
//函数模板
template <typename T>
void myTest(T m,T n)
{
cout << "调用模板函数"<< endl;
}
调用时:
myTest<>(10,20); // <>空参数列表
经过测试,可以发现调用的是函数模板。
3、函数模板可以重载