文章目录
泛型编程
泛型编程是从一个抽象层面描述一种类型的算法,不管容器类型是什么,是一种不同于OOP的角度来抽象具体算法
C++用模板来实现泛型编程,模板分为函数模板和类模板
函数模板
template<class/typename T> //告诉编译器遇到T不要报错
mySwap(T &a, T &b) //类型参数化,在使用时会进行自动类型推导,将a和b的类型传给T
mySwap<int>(a, b) //显式指定类型
在使用函数模板时,一定要让编译器知道T是什么类型,否则无法使用
函数模板和普通函数的区别
类型转换
普通函数可以进行隐式类型转换(显示表示)
函数模板不可以
调用顺序
当普通函数对函数模板进行了函数重载时,优先调用普通函数,如果普通函数出错,则出错,不会再去调用函数模板
如果需要强制调用函数模板,可以加 <> 来调用
函数模板也可以进行函数重载
如果函数模板可以产生更好的匹配,优先调用函数模板
模板的机制
- 模板并不是万能的,不能通用所有的数据类型
- 模板不能直接调用,生成后的模板函数才可以调用
- 函数模板会进行两次编译,第一次对函数模板进行编译,检查语法错误,第二次对替换T 的类型进行编译
函数的局限性
模板不能解决所有的类型,可以使用第三代具体化来实现
//函数模板
template<class T>
bool myCompare(T &a, T&b)
{
if(a ==b)
{
return true;
}
return false;
}
//第三代具体化,如果能直接匹配,就优先调用
template bool myCompare<Person>(Person &a, Person &b)
{
if(a.age == b.age)
{
return true;
}
return false;
}
类模板
template <class NameType, class AgeName = int> //可以有默认类型参数
class Person
{
public:
Person(NameType name, AgeType age)
{
m_name = name;
m_age = age;
}
NameType m_name;
AgeType age;
};
Person<string, int> p("heihei",100); //函数模板可以进行自动类型推导,而类模板不行
类模板的成员函数在未确定时不会创建,只有确认了才会创建
类模板做函数参数
指定传入类型
template<class NameType, class AgeType>
class Person
{
public:
Person(NameType name, AgeType age)
{
this->m_name = name;
this->m_age = age;