C++模板
基本语法
以置换函数为例: 1
2
3
4
5
6
7
8//使用模板必须确定数据类型T,并能够推导出一致的类型
template<class T>
void mySwap(T& a, T& b)
{
T temp = a;
a = b;
b = temp;
}mySwap(a, b); -
显示指定类型:mySwap<int>(a, b); ## 隐式类型转换
在调用函数时,若实参与形参数据类型不一致,实参根据形参类型进行转化(如char类型转化成对应的ASCII码)
普通函数&显示指定类型模板函数会发生隐式类型转换
自动类型推导不会发生,会报错 ## 调用规则 - 优先调用普通函数 -
可以通过空模板参数列表强制调用函数模板
myPrint<>(a,b); - 函数模板可以发生重载 -
如果函数模板更好匹配,优先调用模板
比如函数模板不用发生隐式类型转换,而普通函数需要 -
提供了函数模板,最好不要再提供普通函数 ## 具体化
模板的通用性不是万能的,如以下代码: 1
2
3
4
5
6template<class T>
bool ifEqual(T a, T b)
{
if (a==b) return 1;
return 0;
}1
2
3
4
5template<> bool ifEqual(person &p1, person &p2)
{
if (p1.name==p2.name && p1.age==p2.age) return1;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12template<class NameType, calss AgeType>
class Person
{
public:
Person(NameType name, AgeType age)
{
m_Name = name;
m_Age = age;
}
NameType m_Name;
AgeType m_Age;
};Person<string, int> p1("name",age); ###
类模板注意事项 1. 类模板无法自动类型推导 2.
类模板参数列表可以有默认参数,如:template<class NameType, calss AgeType = int>
3. 类模板成员函数在调用时才会创建 ### 类模板对象作函数参数 1.
指定传入类型:void 函数名(类名<数据类型1, 数据类型2>&对象名)
2. 参数模板化:template<class T1, class T2> 3.
整个类模板化 1
2
3
4template<class T>
void func(T &p)
{
}calss son: public Base<int>
2. 如果想灵活指定父类T类型,子类也需要写成类模板 1
2
3
4template<class T1, calss T2>
class son: public Base<T2>
{
};1
2
3
4
5
6template<class T1, class T2> //需要加上模板参数列表
Person<T1, T2>::Person(T1 name, T2 age)
{
this->m_Name = name;
this->m_Age = age;
}