在动手写11.2.2中,我们实现了add()函数,将Vector2D与某一类型相加,但是函数的实现却决定了这个类型只能是基本类型,或是重载加法能返回特定数值的类。对于Vector2D来说,我们也想实现Vector2D与Vector2D的分量相加,这种单独实现某种具体类的模板函数或模板类的需求可以用模板特化(Template Specialization)来满足。
动手写11.4.1
动手写11.4.1展示了模板特化的使用,运行结果如图11.4.1所示:
图11.4.1 模板特化
我们可以看到,模板特化实际上是将指定的类型代入函数,而且函数实现也不一样。由于类型已经确定了,我们也不需要模板形参表,就保留空的形参表让编译器知道这还是一个跟模板有关的函数。
特化了Vector2D<int>和Vector2D<int>相加的版本之后,我们可以使用这个版本,也可以依然使用通用的一般版本。(www.xing528.com)
除了特化所有模板形参之外,我们也可以只对模板的一部分模板形参做特化,这就叫作偏特化(Partial Specialization)。接下来让我们看一个示例:
动手写11.4.2
动手写11.4.2展示了偏特化的应用,运行结果如图11.4.2所示:
图11.4.2 偏特化
我们可以看到,通过在新的类模板定义中指定要特化的模板形参(class MyVec<T,2>),我们就可以实现特殊的二维向量成员函数。而在这个偏特化的二维向量的类定义中,我们依然保持T为未特化的状态,而将使用dim的地方都改成2。这样之后不管我们定义了MyVec<int,2>还是MyVec<float,2>,编译器都会自动生成相应的完全特化的类定义。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。