1. 函数模板
1)函数模板的需要
通过以上篇的学习,你可以写出易读、安全和可维护的代码;函数和类是高效编程的灵活工具,但C++必须要求你明确所有参数的类型;
例如你需要写求最大值的函数,包括整型和浮点型:
以上两个函数在形式上是一样的,只是类型不一样。
如果只写一个函数,满足任何类型,可以用函数模板来实现。
1)什么是函数模板?
模板-用以创建类似对象的模式;
在C++中,函数模板是用以创建类似函数的模式。使用模板类型参数-通常简略为-T。
2)创建函数模板
3)使用函数模板
如上可以看出,使用函数模板节省了大量时间,减少了代码维护量,更安全。
模板函数也有一些不足:一些老编译器没有足够的支持;模板函数给出了难以理解的错误信息;
在STL中,已有Max函数。
2. 函数模板示例
1)函数模板示例
C++并没有直接编译模板函数;在编译期间,当遇到调用函数模板,编译器将类型和参数传入模板,执行得到结果;
编译器足够聪明来确定是否需要创建一个不同类型的函数模板实例。
2)运算符、函数调用和函数模板
模板函数应用于内建数据类型和类,模板中调用的任何运算符和函数必须是已定义的。
3. 模板类
函数模板是泛型编程的入门了,但函数模板不能解决所有的问题。
这时,该介绍模板类了。
1)模板和容器类
之前介绍过数组容器:
Arary.h:
测试:
模板类是应用容器类的最理想的;
模板类是C++最好和最有用的特性。
4. 表达式参数和模板特殊化
模板类可以使用另外一种模板参数,即表达式参数。
1)表达式参数:
表达式参数-不是由类型来取代的参数,而是由值来取代的参数。
一个表达式参数可以是:
A)一个是整型或枚举型的值;
B)一个对象的指针或引用;
C)一个函数的指针或引用;
D)一个成员函数的指针或引用。
2)模板特殊化
如下例的Storage:
Storage可以存储多种类型的,但是需要打印如char类型指针时:
我们可以通过函数模板特殊化:
5. 类模板特殊化
如下例:
Storage8适合多种类型。
在前一章节中,可以特殊化成员函数,提供对特殊类型的特殊处理。
2)类模板特殊化
类模板特殊化-允许为明确的数据类型特殊化类模板;类模板特殊化看作是完整独立的类。