函数模板特化(全特化与偏特化)
请解释C++函数模板的全特化(Full Specialization)和类模板的偏特化(Partial Specialization)概念、语法、使用场景及注意事项。
回答
苦行僧
模板特化:针对某些特定类型参数提供特殊实现。
函数模板全特化:
template<typename T> void func(T x) { /* 通用 */ }
template<> void func<int>(int x) { /* int特化 */ }
- 函数模板只支持全特化,不支持偏特化(可用重载模拟)。
- 注意:函数模板特化不是重载,重载是优先级选择。
类模板全特化:
template<typename T> struct MyType { /* 通用 */ };
template<> struct MyType<int> { /* int特化 */ };
类模板偏特化:
// 针对指针类型
template<typename T> struct MyType<T*> { /* 指针实现 */ };
// 针对两个相同类型
template<typename T> struct Pair<T, T> { /* 相同类型 */ };
使用场景:
- 为特定类型优化性能(如vector特化)。
- 处理特定类型的不同行为(如const char*比较按字符串而非指针)。
- 类型萃取(type traits)的实现。
注意事项:
- 模板特化必须在原始模板声明之后、同一命名空间中定义。
- 特化版本与原始模板的接口应保持一致。
- 偏特化只能用于类模板/变量模板(C++14),不能用于函数模板。