面试题答案
一键面试#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;
}
代码解释
-
MyTypeTraits 模板类:
template <typename T>
:定义一个模板类,模板参数为T
。static const bool isInteger = std::is_integral<T>::value;
:使用std::is_integral
来判断T
是否为整数类型,如果是,isInteger
为true
,否则为false
。std::is_integral
是 C++ 标准库提供的类型特征模板,用于判断类型是否为整数类型。
-
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>::isInteger
为true
时,这个模板函数才是有效的,否则会被忽略。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>::isInteger
为false
时,这个模板函数才是有效的。void processType(T)
:函数接受一个T
类型的参数(这里参数名省略,因为在函数体中未使用具体参数值)。std::cout << "Type is not an integer" << std::endl;
:打印提示信息表明传入的类型不是整数。
- 整数类型版本: