模板的局限性:
- 模板的通用性不是万能的;
(数组无法直接进行赋值操作;)
C++为了解决这种问题,提供模板的重载,可以为这些特定的类型提供具体化的模板;
class Person {
public:
Person(string name,int age) {
this->m_name = name;
this->m_age = age;
}
string m_name;
int m_age;
};
//普通函数模板
template<typename T>
bool compare(T& a,T& b) {
if (a == b) {
return true;
}else {
return false;
}
}
//利用具体化Person的版本实现代码,具体化优先调用
//具体化,显示具体化的原型需要以template<>开头,并通过名称指出类型;
//具体化优先于常规模板
template<> bool compare(Person& p1, Person& p2) {
if (p1.m_age==p2.m_age&&p1.m_name==p2.m_name) {
return true;
}
else {
return false;
}
}
int main() {
int a = 10, b = 10;
//内置数据类型可以直接使用通用的函数模板
if (compare(a, b)) {
cout << "a与b相等!" << endl;
}
else {
cout << "a与b不相等!" << endl;
}
Person p1("张三", 18);
Person p2("李四", 18);
//自定义数据类型,不会调用普通的函数模板
//可以创建具体化的Person数据类型的模板,用于特殊处理这个类型;
if (compare(p1, p2)) {
cout << "p1与p2相等!" << endl;
}else {
cout << "p1与p2不相等!" << endl;
}
system("pause");
return 0;
}
代码过程中的注意事项:
注意:因为模板一般为T类型,不够具体,而如果是用形参为T a 则需要复制一份一样的数据;
所以要解决这种不够具体的情况,一般是使用引用类型;T& a;直接使用原数据;
总结
- 利用具体化的模板,可以解决自定义类型的通用化;
- 学习模板并不是为了写模板,而是在STL能够运用系统提供的模板;
类模板
类模板语法:
- 类模板作用:建立一个通用类,类中的成员数据类型可以不具体制定,用一个虚拟的类型来代表;
解释:
template ——声明创建模板;
typename ——表明其后面的符号是一种数据类型,可以用class代替;
T —— 通用的数据类型,名称可以替换,通常为大写字母;
//类模板
template<typename nameType,typename ageType>
class Person {
public:
Person(nameType name, ageType age) {
this-><