MST

星途 面试题库

面试题:C++ 中 SFINAE 与类型特征结合在模板元编程的应用

假设我们有一个模板类 `MyTypeTraits` 用于判断某个类型是否为整数类型,基于此类型特征,使用 SFINAE 实现一个模板函数 `processType`,当传入的类型为整数时,函数打印该整数的平方;当传入的类型不是整数时,函数打印提示信息 'Type is not an integer'。请详细写出 `MyTypeTraits` 和 `processType` 的实现代码,并解释每一步的作用。
17.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <type_traits>

// 定义类型特征模板类 MyTypeTraits
template <typename T>
struct MyTypeTraits {
    // 如果 T 是整数类型,isInteger 为 true_type,否则为 false_type
    static const bool isInteger = std::is_integral<T>::value; 
};

// 使用 SFINAE 实现 processType 模板函数
template <typename T, typename = std::enable_if_t<MyTypeTraits<T>::isInteger>>
void processType(T num) {
    // 当 T 是整数类型时,打印该整数的平方
    std::cout << num * num << std::endl; 
}

template <typename T, typename = std::enable_if_t<!MyTypeTraits<T>::isInteger>>
void processType(T) {
    // 当 T 不是整数类型时,打印提示信息
    std::cout << "Type is not an integer" << std::endl; 
}

代码解释

  1. MyTypeTraits 模板类

    • template <typename T>:定义一个模板类,模板参数为 T
    • static const bool isInteger = std::is_integral<T>::value;:使用 std::is_integral 来判断 T 是否为整数类型,如果是,isIntegertrue,否则为 falsestd::is_integral 是 C++ 标准库提供的类型特征模板,用于判断类型是否为整数类型。
  2. processType 模板函数重载

    • 整数类型版本
      • template <typename T, typename = std::enable_if_t<MyTypeTraits<T>::isInteger>>:这里使用了 SFINAE(Substitution Failure Is Not An Error)技术。std::enable_if_t<MyTypeTraits<T>::isInteger> 表示当 MyTypeTraits<T>::isIntegertrue 时,这个模板函数才是有效的,否则会被忽略。
      • void processType(T num):函数接受一个 T 类型的参数 num
      • std::cout << num * num << std::endl;:打印 num 的平方。
    • 非整数类型版本
      • template <typename T, typename = std::enable_if_t<!MyTypeTraits<T>::isInteger>>:当 MyTypeTraits<T>::isIntegerfalse 时,这个模板函数才是有效的。
      • void processType(T):函数接受一个 T 类型的参数(这里参数名省略,因为在函数体中未使用具体参数值)。
      • std::cout << "Type is not an integer" << std::endl;:打印提示信息表明传入的类型不是整数。