#include <type_traits>
#include <cmath>
// 主模板,用于整数类型
template <typename T, typename = std::enable_if_t<std::is_integral_v<T>>>
T conditionalFunction(T value) {
return value * value;
}
// 偏特化模板,用于浮点数类型
template <typename T, typename = std::enable_if_t<std::is_floating_point_v<T>>>
T conditionalFunction(T value) {
return std::sqrt(value);
}
类型参数推导与SFINAE机制协同工作说明:
- 类型参数推导:在调用
conditionalFunction
时,编译器会根据传入的实参类型推导出模板参数T
。例如,如果传入一个int
类型的参数,编译器就会推导出T
为int
。
- SFINAE机制:
std::enable_if_t
是SFINAE机制的一种应用。对于主模板template <typename T, typename = std::enable_if_t<std::is_integral_v<T>>>
,当T
是整数类型时,std::is_integral_v<T>
为true
,std::enable_if_t<std::is_integral_v<T>>
是一个有效的类型,模板实例化成功。当T
不是整数类型时,std::is_integral_v<T>
为false
,std::enable_if_t<std::is_integral_v<T>>
是一个无效的类型,此时模板实例化失败,但由于SFINAE机制,这种失败不会导致编译错误,只是该模板被排除在候选模板之外。
- 偏特化模板:同理,对于偏特化模板
template <typename T, typename = std::enable_if_t<std::is_floating_point_v<T>>>
,当T
是浮点数类型时,模板实例化成功;否则,模板实例化失败但不会导致编译错误。
- 其他类型:如果传入的类型既不是整数类型也不是浮点数类型,所有模板实例化都会失败,由于没有其他可用的模板,最终导致编译不通过。