background image

return min(5.3, 18.6);

这两个宏非常好用,但是在 C++中,它们并不像在 C 中那样受欢迎。宏因为没有类
型检查以及天生的不安全(例如如果代码写为 min(a++, b--);则显然结果非你所
愿),在 C++中被 inline 函数替代。但是随着你将 min/max 改为函数,你立刻就

 —— 

会发现这个函数的局限性

它不能处理你指定的类型以外的其它类型。例如你的

min()声明为:

int min(int a, int b);

则它显然不能处理 float 类型的参数,但是原来的宏却可以很好的工作!你随后大
概会想到函数重载,通过重载不同类型的 min()函数,你仍然可以使大部分代码正
常工作。实际上,C++对于这类可以抽象的算法,提供了更好的办法,就是模板:

template <class T> const T & min(const T & t1, const T & t2) {
    return t1>t2?t2:t1;
}

这是一个模板函数的例子。在有了模板之后,你就又自由了,可以像原来在 C 语言
中使用你的 min 宏一样来使用这个模板,例如:

return min(10,4);

也可以:

return min(5.3, 18.6)

你发现了么?你获得了一个类型安全的、而又可以支持任意类型的 min 函数,它是
否比 min 宏好呢?

当然上面这个例子只涉及了模板的一个方面,模板的作用远不只是用来替代宏。实
际上,模板是泛化编程(Generic Programming)的基础。所谓的泛化编程,就是
对抽象的算法的编程,泛化是指可以广泛的适用于不同的数据类型。例如我们上面
提到的 min 算法。

2. 语法

 

你千万不要以为我真的要讲模板的语法,那太难为我了,我只是要说一下如何声明
一个模板,如何定义一个模板以及常见的语法方面的问题。

template<> 是模板的标志,在<>中,是模板的参数部分。参数可以是类型,也
可以是数值。例如:

template<class T, T t>
class Temp{