模板
语法:
template
<
typename
T
>
void
mySwap
(
T
&
a
,
T
&
b
)
{
T temp
=
a
;
a
=
b
;
b
=
temp
;
}
//1
、自动类型推导
mySwap
(
a
,
b
);
//2
、显示指定类型
mySwap
<
int
>
(
a
,
b
);
模板的注意事项:
// 1
、自动类型推导,必须推导出一致的数据类型
T,
才可以使用
void
test01
()
{
int
a
=
10
;
int
b
=
20
;
char
c
=
'c'
;
mySwap
(
a
,
b
);
//
正确,可以推导出一致的
T
//mySwap(a, c); //
错误,推导不出一致的
T
类型
}
// 2
、模板必须要确定出
T
的数据类型,才可以使用
template
<
class
T
>
void
func
()
{
cout
<<
"func
调用
"
<<
endl
;
}
void
test02
()
{
//func(); //
错误,模板不能独立使用,必须确定出
T
的类型
func
<
int
>
();
//
利用显示指定类型的方式,给
T
一个类型,才可以使用该模板
}
普通函数与函数模板的区别:
普通函数调用时可以发生自动类型转换(隐式类型转换)char 》int
函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换
如果利用显示指定类型的方式,可以发生隐式类型转换
普通函数与函数模板的调用规则:
1.
如果函数模板和普通函数都可以实现,优先调用普通函数
2.
可以通过空模板参数列表来强制调用函数模板
//2
、可以通过空模板参数列表来强制调用函数模板
myPrint
<>
(
a
,
b
);
//
调用函数模板
3.
函数模板也可以发生重载
4.
如果函数模板可以产生更好的匹配
,
优先调用函数模板
template<> bool myCompare(Person &p1, Person &p2)
{
if ( p1.m_Name == p2.m_Name && p1.m_Age == p2.m_Age)
{
return true;
}
else
{
return false;
}
}
类模板
template<class NameType, class AgeType>
Person(NameType name, AgeType age)
Person<string, int>P1("孙悟空", 999);
//必须显示指定数据类型
//类模板在模板参数列表中可以
有默认参数
->
template<class NameType, class AgeType = int>
Person <string> p("猪八戒", 999);