前言:
1.泛型编程
2.函数模版
3.类模版
为什么要有类模版?使用typedef不行吗?
类模版只能显示实例化:
注意类名与类型的区别:
注意类模版最好不要声明和定义分离:
总结:
前言:
正如标题而言,这里只是对模版的简单认识与使用,方便后面博客介绍stl中一些容器的实现,更复杂详细的模版相关的内容将会在模版进阶中介绍。
1.泛型编程
编写与类型无关的通用代码,是代码复用的一种手段,模版是泛型编程的基础。
而模版又分为函数模版与类模版。
2.函数模版
template void Swap(T& x, T& y) { T tmp = x; x = y; y = tmp; } int main() { int a = 1, b = 2; double c = 1.0, d = 2.0; Swap(a, b); Swap(c, d); return 0; }
首先要注意第一点:
两次调用的Swap函数实际都不是同一个函数,第一是函数调用开辟的栈帧都不一样大,一个是int,一个是double;第二是汇编call的函数的地址也是不一样的。
这里的class可用typename替换,区别在后面的学习中会介绍。
补充一下库中的swap函数:
那模版参数是怎么识别不同的类型的呢?这就是模版的实例化,实际就是编译器帮你完成了这个工作,是隐式的实例化自动推演模版的类型。模版的实例化发生在编译时期,所以是在编译的时候根据类型推导生成的代码:
那下面来看两个问题,首先第一个,传的模版参数不明确,会报错:
template T Add(const T& left, const T& right) { return left + right; } int main() { int a = 1; double b = 1.1; Add(a, b);//报错
解决方法1:
强制转换类型,但是会丢失精度。
Add(a1,(int)d1);
解决方法2:
使用显示实例化,其实经历了隐式类型转换:
cout