MST
星途 面试题库

面试题:C++ 中 SFINAE 在模板选择里的基础应用

请解释 SFINAE(Substitution Failure Is Not An Error)的概念,并举例说明如何利用 SFINAE 在两个模板函数之间根据参数类型进行合理选择。
31.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

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函数匹配。