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使用,它发生在模板匹配阶段。