C++提供两种模板机制:函数模板,类模板。
函数模板:
建立一个通用函数,其返回值类型和形参类型不具体确定,用一个虚拟的类型来代替。
如:void test(int a);其中的void和int可以先不确定,等执行的时候在确定。
语法:
template<typename T>
template - 声明创建模板
typename - 表明其后面的符号是一种数据类型,可以用class代替
T - 通用的数据类型,名称可以替换,通常为大写字母
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
template<typename T>
void Swap(T &a, T &b) {
T temp = a;
a = b;
b = temp;
}
int main() {
int a = 5;
int b = 15;
Swap(a, b);//自动类型推导
//Swap<int>(a,b)这种方法也可以
cout << a << endl;
cout << b << endl;
double c = 0.4;
double d = 4.6;
Swap(c, d);
//Swap<double>(c,d);
cout << c << endl;
cout << d << endl;
system("pause");
return 0;
}
注意事项:
自动类型推导 ,必须推导出一致的数据类型T,才可以使用
模板必须要确定出T的数据类型,才可以使用
template<typename T>
void test() {
cout << "etjklaj" << endl;
}
这样调用上面这个函数的话就不能用自动类型推导了,要给定类型
如:test< int >();
普通函数与 函数模板的调用规则:
1.如果函数模板 和普通函数都可以实现,优先调用普通函数
2.可以通过空模板参数列表来强制调用函数模板,例:Swap<>(参数,…,)
3.函数模板也可以发生重载(参数个数的不同)
4.如果函数模板可以产生更好的匹配,优先调用函数模板(如果调用普通函数需要强制类型转换,则优先调用模板)
类模板
建立一个通用类,类中的成员数据类型可以不具体制定,用一个虚拟的类型来代表。
template<typename Typename,typename Typeage>
class Person {
public:
Person(Typename name, Typeage age) {
this->m_name = name;
this->m_age = age;
}
Typename m_name;
Typeage m_age;
};
void test() {
Person<string,int> p1("zhang", 24);
cout << p1.m_name << endl;
cout << p1.m_age << endl;
}
类模板与函数模板的区别:
1.类模板没有自动类型推导的使用方式。
2.类模板在模板参数列表中可以有默认参数。
template<typename Typename,typename Typeage=int>
类模板与继承:
当类模板碰到继承时,需要注意以下几点:
1.当子类继承的父类是一个类模板时,子类在声明的时候,需指定出父类中的T的类型。
2.如果不指定,编译器无法给子类分配内存
class Person {
public:
T m_age;
};
class son :public Person<int> {//要指定出T的类型
};
3.如果想灵活指出父类中T的类型,子类也需变为类模板
template<typename T>
class Person {
public:
T m_age;
};
template<typename T1, typename T2>
class son :public Person<T2> {
T1 m_n;
};
void test() {
son<int ,char> s;//类模板必须指定传入类型
}
类模板成员函数类外实现时,要加上模板参数列表
template<typename T1,typename T2>
class Person {
public:
Person(T1 mame, T2 age);
void show();
T1 m_name;
T2 m_age;
};
template<typename T1, typename T2>
Person<T1,T2>::Person(T1 name, T2 age)
{
this->m_age = age;
this->m_name = name;
}
template<typename T1, typename T2>
void Person<T1, T2>::show() {
cout << "姓名" << this->m_name << endl;
cout << "年龄" << this->m_age << endl;
}
void test() {
Person<string, int> p("zhai", 43);
p.show();
}