cppSFINAE与约束

内容简介

SFINAE 表示模板替换失败不算硬错误,而是把当前候选模板从匹配集合中移除。它常用于根据类型能力启用或禁用模板。

现代 C++ 更推荐用 if constexpr 和 concepts 表达约束;SFINAE 主要用于读旧代码、写兼容库或理解标准库实现。

典型旧写法

#include <type_traits>
 
template <typename T>
std::enable_if_t<std::is_integral_v<T>, void>
print(T value)
{
    // 只允许整数类型
}

现代写法

#include <concepts>
 
template <std::integral T>
void print(T value)
{
    // 只允许整数类型
}

适合放在深水区的原因

  • 错误信息复杂。
  • 写法容易影响可读性。
  • 普通业务开发通常不需要手写。
  • 但很多泛型库和旧代码会大量出现。

注意事项

  • C++20 后复杂类型约束优先使用 concepts。
  • 简单分支可以用 if constexpr
  • 不要把 SFINAE 当作普通 if 使用,它发生在模板匹配阶段。

相关:cpp常用模板工具cpp类型萃取cpp模板偏特化