面试题答案
一键面试SFINAE概念
SFINAE(Substitution Failure Is Not An Error)即替换失败不是错误。在C++模板实例化过程中,如果为模板参数替换类型时导致模板无效,这种替换失败不会引发编译错误,而是会使该模板被忽略,编译器会尝试寻找其他合适的模板。
利用SFINAE根据参数类型选择模板函数示例
#include <iostream>
#include <type_traits>
// 辅助模板,用于判断类型是否为整数
template <typename T>
struct is_integer_type : std::false_type {};
template <>
struct is_integer_type<int> : std::true_type {};
// 第一个模板函数,当参数类型为整数时匹配
template <typename T, typename = std::enable_if_t<is_integer_type<T>::value>>
void func(T t) {
std::cout << "This is an integer: " << t << std::endl;
}
// 第二个模板函数,当参数类型不是整数时匹配
template <typename T, typename = std::enable_if_t<!is_integer_type<T>::value>>
void func(T t) {
std::cout << "This is not an integer: " << t << std::endl;
}
int main() {
func(10); // 调用第一个模板函数
func("Hello"); // 调用第二个模板函数
return 0;
}
在上述代码中,is_integer_type
模板用于判断类型是否为整数。func
模板函数利用std::enable_if
结合is_integer_type
来实现根据参数类型选择不同的函数版本。当参数类型为整数时,第一个func
函数匹配;当参数类型不是整数时,第二个func
函数匹配。