C++模板定义
C++模板允许程序员在通用编程中创建可重用的代码,这种编程技术基于模板的编译时多态性。程序员通过模板可处理多种类型儿无需为每种类型编写不同的代码。
C++模板分为
函数模板
和
类模板
。
函数模板
请看下面一个简单的两个参数的加法示例:(基于Qt环境)
#include <QCoreApplication>
#include <QtDebug>
//Int 类型的求和函数
int addInt(int a,int b){
return a+b;
}
//Float 类型的求和函数
float addFloat(float a,float b){
return a+b;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int result= addInt(1,3);
qDebug()<< "addInt:"<<result;
float fresult=addFloat(1.1,3.3);
qDebug()<<"addFloat:"<<fresult;
return a.exec();
}
得到的结果:
addInt: 4
addFloat: 4.4
上述示例展示了Int和Float类型的两个参数的加法函数,当我们需要使用其他类型的参数(如char、byte、long long ,double 等)做加法运算时则需要定义新的函数,原来的函数不能得到复用造成代码臃肿。
我们可以使用函数模板对其进行简化:
#include <QCoreApplication>
#include <QtDebug>
//使用模板的泛型求和函数
template <typename T>
T add(T a,T b){
return a+b;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug()<<"addInt:"<<add(1,3);
qDebug()<<"addFloat:"<<add(1.1,3.3);
return a.exec();
}
得到的结果:
addInt: 4
addFloat: 4.4
基于以上示例,我们可以看出,使用函数模板使代码行数减少,代码更加灵活。
函数模板定义:
template <typename 形参名T1, typename 形参名T2,...,typename 形参名Tn>//n>=1
返回值类型 函数名(参数列表) //函数定义
{
// 函数体;
}
类模板
类模板代表一族类,是用来描述通用数据类型或处理方法的机制。它使类中的成员函数和数据成员可以取任意的数据类型。类模板可以说是说是生成类,减少了类的定义数量。
以下是一个类模板的示例:
//类模板
template <typename T1,typename T2> //使用typname 关键字
class Person{
public:
Person(T1 name,T2 age){
this->m_age=age;
this->m_name=name;
}
//打印成员变量值
void showInfo() {
cout<<"name:"<<m_name<<endl;
cout<<"age:"<<m_age<<endl;
}
private:
T1 m_name;
T2 m_age;
};
模板类可以继承,当继承模板类时应当指定父类的模板类型
//类模板与继承
template <typename T1=string,class T2=int,typename T3=float> //typename 与class 关键字等效;
// 形参可以指定类型
class Student:public Person<T1,T2>
{
public:
//构造函数
Student(T1 name,T2 age,T3 score):Person<T1, T2> (name,age){
this->m_score=score;
}
void showInfo() {
Person<T1,T2>::showInfo();
cout<<"score:"<<m_score<<endl;
}
private:
T3 m_score;
};
int main(int argc, char *argv[])
{
// 实例化对象
Student<std::string,int,float> student("jack",18,80.9f);
student.showInfo();
}
输出结果
name:jack
age:18
score:80.9
类模板的定义
类模板定义时,typename与class 关键字等效:
template <typename 类型参数>
class 类名{
//成员列表
}
等效为:
template <class 类型参数>
class 类名{
//成员列表
}
模板的优缺点
当选择使用C++模板时,你应当理解它的优缺点。基于使用场景以及模板的优缺点决定是否选择使用C++模板。
模板的优点
使用模板可以提高代码的可重用性,并且可以使得代码更加灵活和可扩展。
模板的缺点
由于模板代码是编译时多态的,因此编译器需要生成大量的代码来处理不同的类型。因此过度使用模板可能会导致编译时间变长,并且可能会时代码更加复杂和难以维护。
示例代码下载