-
泛型编程:编写与数据类型无关的逻辑代码
-
模板:实现代码重用的一种工具,数据类型参数化(1. 函数模板 2. 类模板)
一 函数模板
函数模板不是一个实体函数,只有功能框架
一 实例
//定义
1 template 关键字
2 <> 类型的参数列表
3 typename 用来声明类型参数,可以用 class 代用
4 Type 类型的形参名
/*······································*/
template<typename Type>
Type add(Type n, Type m)
{
return n+m;
}
/*······································*/
//调用
1 函数名<类型实参>(数据实参)
2 适当的时候,类型实参可以省略
/*······································*/
template<typename Type>
Type add(Type n, Type m)
{
return n+m;
}
int main()
{
cout << add<double>(5.3, 4) << endl;//1. 显式指定
cout << add(4.3,2.3) << endl; //2. 隐式推导
return 0;
}
二 注意事项
-
能重载
-
普通函数优先被调用
-
如果普通函数效果不如模板,会自动调用模板
-
可以强制使用模板
二 类模板
一 实例
template<class NameType, class AgeType>
class Person
{
public:
Person(){}
Person(NameType name, AgeType age)
{
this->name = name;
this->age = age;
}
AgeType getAge();
public:
NameType name;
private:
AgeType age;
}
/*······································*/
template<class NameType, class AgeType>
AgeType Person<NameType,AgeType>::getAge()
{
return this->age;
}
/*······································*/
int main()
{
Person<string,int>obj;
Person<string,int>obj("Wang",28);
return 0;
}
二 类模板做函数参数
void show1(Person<string,int>&obj)
{
cout << obj.name << obj.getAge <<endl;
}
/*······································*/
template<class Type1, class Type2>
void show2(Person<Type1, Type2>&obj)
{
cout << obj.name << obj.getAge <<endl;
}
/*······································*/
template<class Type>
void show3(Type& obj)
{
cout << obj.name << obj.getAge <<endl;
}
三 类模板和继承
#include<iostream>
using namespace std;
template<typename T>
class Father
{
T t;
};
class Son1 : public Father<int>
{
int num;
};
四 补充要点
-
类模板不能分文件编写
-
(.hpp) 既有声明又有实现
三 友元函数与类模板
template<class T>
class A;
template<class T>
void show_1(A<T>& obj);
template<class T>
class A
{
public:
A():t(6){}
friend void show_1<>(A<T>& obj);//细节 ❤️<>❤️接收类型
private:
T t;
};
template<class T>
void show_1(A<T>& obj)
{
cout << obj.t <<endl;
}