(这只是在下的粗浅理解,不足的地方还请谅解,欢迎留言提出,后期理解深入后会加以改进)
模板是什么?
模板是泛型编程的基础,而所谓的泛型编程就是编写与类型无关的逻辑代码,是一种复用的方式。
模板可以分为模板函数和模板类。
定义:
模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现了真正的代码可重用性
模板函数:
格式:
template<class 形参名1,class 形参名2,class 形参名n>
返回类型 函数名(参数列表)
{...}
(注:形参的定义可以用class ,也可以用typename)
下面定义一个模板函数:
template<class T>
T min(T& x, T& y)
{
return x > y ? x : y;
}
void test()
{
int x = 3, y = 33;
double a = 2.33, b = 5.66;
char c1 = 'A', c2 = 'Z';
cout << min(x, y) << endl;
cout << min(a, b) << endl;
cout << min(c1, c2) << endl;
}
运行结果如上图所示,虽然只写了一个函数,但是在编译模板函数时编译器会根据传递的参数自动推演出模板形参的类型,并且自动生成对应的代码。
模板类:
格式
template<class 形参名1, class 形参名2, ...class 形参名n>
class 类名
{ ... };
其中,template是声明各模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个
template<typename T1, typename T2>
class myClass{
private:
T1 x;
T2 y;
public:
myClass(T1 a, T2 b);
void show();
};
template <typename T1, typename T2>
myClass<T1, T2>::myClass(T1 a, T2 b)
:x(a)
,y(b)
{}
template <typename T1, typename T2>
void myClass<T1, T2>::show()
{
cout << "x=" << x << ", y=" << y << endl;
}
void test()
{
myClass<int, int> class1(3, 33);
class1.show();
myClass<int, char> class2(3, 'A');
class2.show();
myClass<double, int> class3(3.15, 33);
class3.show();
}
非类型模板参数
非类型模板参数可以是长整数(包括枚举)或者是指向外部链接对象的指针
也就是说,浮点数是不行的,指向内部链接对象的指针也是不行的
类模板的特化
template<typename T1, typename T2>
class myClass{
private:
T1 x;
T2 y;
public:
myClass();
};
template <typename T1, typename T2>
myClass<T1, T2>::myClass()
{
cout << "myClass<T1,T2>" << endl;
}
//局部特化:
template<typename T1>
class myClass<T1, int> {
private:
T1 x;
int y;
public:
myClass();
};
template <typename T1>
myClass<T1, int>::myClass()
{
cout << "myClass<T1,int>" << endl;
}
总结:
优点:
1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生。
2. 增强了代码的灵活性。
缺点:1. 模板让代码变得凌乱复杂,不易维护,编译代码时间变长。
2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误