CodeWalk

函数模板特化(全特化与偏特化)

作者:苦行僧 · 2026-05-30 12:55

请解释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),不能用于函数模板。