显式特化的用例之一是避免在实际函数中发生某些更改时跳过常规template
函数。要了解以下示例:
template<typename T1, typename T2>
void foo(T1 o1, T2 o2) // template function
{}
void foo(int o1, int o2) // regular function overloaded
{}
到现在还好。现在过了一段时间你必须改变定义template<> foo()
template<typename T1, typename T2, typename T3> // new parameter added
void foo(T1 o1, T2 o2, T3 o3) // template function
{}
您相应地更改了所有调用foo()
,但您错过/弄乱了更改常规重载函数foo()
。那么,就是一场灾难!因为编译会顺利进行,并且常规调用会被悄悄地替换template<> foo()
,这是不希望的。
现在,如果有一个明确的专业化,例如,
template<>
void foo(int o1, int o2) // explicit specialization
{}
那么这个函数会因为参数不匹配而给你编译错误,这会提醒你相应的变化。
另一种用法或(区别)是可以将显式专用函数包含在头文件中,而无需担心多符号链接错误。请注意,显式专业化也有其自身的缺点,但我演示了它的一个好的方面。