模板机制
- 编译器并不是把函数模板处理成能够处理任何类型的函数
- 函数模板通过具体类型产生不同的函数(产生了模板函数)
- 编译器会对函数模板进行两次编译,在声明的地方对模板代码本身进行编译,在调用的地方对参数替换后的代码进行编译。
模板的局限性
模板并不是真正的通用的代码,对于一些自定义数据类型,模板有时候不能实现效果
可以通过具体化实现对自定义数据类型进行操作。
#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
Person(string name, int age)
{
this->m_Name = name;
this->m_Age = age;
}
string m_Name;
int m_Age;
protected:
private:
};
// 通过模板进行两个数的比较
template<class T>
bool myCompare(T &a, T&b)
{
if (a == b)
{
return true;
}
return false;
}
// 利用具体化Person函数,告诉编译器走 Person对比代码
template<>bool myCompare<Person>(Person &a, Person &b)
{
if (a.m_Name == b.m_Name&&a.m_Age == b.m_Age)
{
return true;
}
return false;
}
void test01()
{
Person p1("Tom", 19);
Person p2("Jerry", 20);
bool ret = myCompare(p1, p2);
if (ret)
{
cout << "a和b相等" << endl;
}
else
{
cout << "a和b不相等" << endl;
}
}
int main()
{
test01();
system("pause");
return 0;
}
类模板基本语法
template 下面紧跟着的是个类,那么这个类称为类模板
类模板和函数模板的区别:
- 类模板使用时候不可以自动类型推导,必须显示指定类型
- 类模板中的类型,可以有默认参数
泛型编程主要体现在模板技术,特点是将类型参数化
#include<iostream>
using namespace std;
// template 下面紧跟着的内容是类,那么这个类称为类模板
// 类模板中的类型,也可以有默认参数
// 泛型编程 类型参数化
template<class NAMETYPE,class AGETYPE>
class Person
{
public:
Person(NAMETYPE name, AGETYPE age)
{
this->m_Age = age;
this->m_Name = name;
}
NAMETYPE m_Name;
AGETYPE m_Age;
};
void test01()
{
// Person p1("Tom", 11); // 对于类模板,使用时候不能自动类型推导
Person<string, int>p1("Ton", 20); // 类模板必须使用显示数据类型
}
int main()
{
system("pause");
return 0;
}