std::enable_if_t是C++14引入的别名模板,定义在<type_traits>中:
template<bool B, typename T = void> using enable_if_t = typename std::enable_if<B, T>::type;它的作用就是:如果B为true,则enable_if_t<B, T>等价于T(默认void);如果B为false,则它不是一个有效的类型。利用“替换失败不是错误”(SFINAE)原则,我们可以用它来有条件地启用或禁用模板的重载或特化。
常见用法
作为函数返回值类型(最推荐,清晰直观)
作为模板默认参数(
typename = std::enable_if_t<...>)作为函数参数(不太常用)
下面举个例子说明做为函数返回值类型的用法
#include <iostream> #include <type_traits> // 版本1:仅当 T 是整数类型时启用 (返回类型为 T) template <typename T> std::enable_if_t<std::is_integral_v<T>, T> // 条件为 true 时,返回类型是 T get_value(T val) { std::cout << "Integral version, value = "; return val; } // 版本2:仅当 T 不是整数类型时启用 (返回类型为 T) template <typename T> std::enable_if_t<!std::is_integral_v<T>, T> // 条件为 true 时,返回类型是 T get_value(T val) { std::cout << "Non-integral version, value = "; return val; } int main() { // 整数类型 -> 调用版本1 int x = 42; std::cout << get_value(x) << std::endl; // 输出: Integral version, value = 42 // 浮点类型 -> 调用版本2 double pi = 3.14; std::cout << get_value(pi) << std::endl; // 输出: Non-integral version, value = 3.14 // 指针类型 (非整数) -> 调用版本2 const char* str = "hello"; std::cout << get_value(str) << std::endl; // 输出: Non-integral version, value = hello return 0; }