显式专业化的用例之一是避免在实际情况发生某些变化时跳过常规函数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()
。那么,这是一个disaster!因为编译会顺利进行,并且常规调用会是silently替换为template<> foo()
,这是不希望的。
现在,是否有明确的专业化,例如,
template<>
void foo(int o1, int o2) // explicit specialization
{}
那么该函数会给你编译错误,因为不匹配的参数并提醒您相应的更改。
另一种用法或(区别)是显式专用函数可以是包含在头文件中无需担心多个符号链接错误。
请注意,显式专业化也有其自身的缺点,但我演示了它好的一面。