类似地,T 支持 operator!= 也是没有必要的,因为如果 operator!= 取得一个类型 X 的 objects(对象)和一个类型 Y 的 objects(对象)是可接受的一样。只要 T 能转型为 X,而 someNastyWidget 的类型能够转型为 Y,对 operator!= 的调用就是合法的。
(一个旁注:此处的分析没有考虑 operator&& 被重载的可能性,这会将上面的表达式的含义从与转换到某些大概完全不同的东西。)
第一次考虑 implicit interfaces(隐式接口)的时候,大多数人都会头疼,但是他们真的不需要阿司匹林。implicit interfaces(隐式接口)简单地由一套 valid expressions(合法表达式)构成。这些表达式自身看起来可能很复杂,但是它们施加的约束通常是简单易懂的。例如,给出这个条件,
if (w.size() > 10 && w != someNastyWidget) ...
关于 functions size,operator> ,operator&& 或 operator!= 上的约束很难说出更多的东西,但是要识别出整个表达式的约束是非常简单的。一个 if 语句的条件部分必须是一个 boolean expression(布尔表达式),所以不管 "w.size() > 10 && w != someNastyWidget" 所产生的类型涉及到的精确类型,它必须与 bool 兼容。这就是 template(模板)doProcessing 施加于它的 type parameter(类型参数)T 之上的 implicit interface(隐式接口)的一部分。被 doProcessing 需要的 interface(接口)的其余部分是 copy constructor(拷贝构造函数),normalize 和 swap 的调用对于类型 T 的 objects(对象)来说必须是合法的。
Things to Remember
classes(类)和 templates(模板)都支持 interfaces(接口)和 polymorphism(多态)。
对于 classes(类),interfaces(接口)是 explicit(显式)的并以 function signatures(函数识别特征)为中心的。polymorphism(多态性)通过 virtual functions(虚拟函数)出现在运行期。
对于 template parameters(模板参数),interfaces(接口)是 implicit(隐式)的并基于 valid expressions(合法表达式)。polymorphism(多态性)通过 template instantiation(模板实例化)和 function overloading resolution(函数重载解析)出现在编译期。