类型 traits 实战
更新时间:2026-10-01。与 13 SFINAE 互补,现代 C++ 优先 concepts/if constexpr。
一、两类 trait
查询返回编译期布尔/类型成员,变换产出新类型;用 _t/_v 模板取结果,如 std::decay_t<T>、std::is_integral_v<T>。
二、编译期分支
cpp
template <class T>
void f(T x) {
if constexpr (std::is_integral_v<T>) { /* 仅整型实例化 */ }
else { /* 另一支,不实例化就不检查 */ }
}std::void_t<...> 可检测 T::value_type 是否存在;自定义 trait 常配合偏特化。
常见坑
- 模板里写普通 if,分支仍要编译。
- 不先
decay就判断数组/引用/const。 is_same<int, const int>为真的误解(为假)。
小结
总结
type traits 把类型信息变成可在编译期使用的数据:查询类(is_integral/is_pointer/is_base_of,用 _v 取布尔)和变换类(remove_reference/add_const/conditional/decay,用 _t 取类型),配合 if constexpr 做编译期分支——未被选中的分支不会实例化检查,远比手写 SFINAE 易读;用 void_t 检测成员是否存在。常见坑是模板里写普通 if(两支仍都要编译)、不先 decay 就判断数组/引用/const,以及误以为 is_same 会忽略 const。