面试题答案
一键面试- 完善模板函数及处理不同类型
T
:- 对于浮点数类型,我们可以使用
std::is_floating_point
类型萃取来判断。如果是浮点数,进行向零截断的转换。 - 对于整数类型,直接返回。
- 对于其他类型,我们可以使用
std::enable_if
结合std::is_integral
和std::is_floating_point
来禁用不支持类型的函数实例化。
- 对于浮点数类型,我们可以使用
#include <type_traits>
template <typename T>
auto convertAndReturn(T value)
-> typename std::enable_if<std::is_integral<T>::value || std::is_floating_point<T>::value,
typename std::conditional<std::is_floating_point<T>::value, int, T>::type>::type {
if constexpr (std::is_floating_point<T>::value) {
// 向零截断
return static_cast<int>(value);
} else {
return value;
}
}
-
处理平台兼容性和溢出问题:
- 平台兼容性:使用
<type_traits>
库中的类型萃取,这些都是标准库提供的,在不同平台上都能保证一致性。 - 溢出问题:
- 对于浮点数转整数,由于
static_cast<int>(value)
已经是向零截断,在不超出int
表示范围时是安全的。为了更保险,可以在转换前检查value
是否超出int
范围。例如,对于float
类型,可以使用std::numeric_limits<int>::min()
和std::numeric_limits<int>::max()
来检查。 - 对于整数类型,因为直接返回,不存在溢出转换问题。
- 对于浮点数转整数,由于
- 平台兼容性:使用
-
类型萃取和SFINAE技术的运用:
- 类型萃取:使用
std::is_integral
和std::is_floating_point
来判断T
的类型特性。这些类型萃取工具可以在编译期获取类型信息,帮助我们做出不同的处理决策。 - SFINAE(Substitution Failure Is Not An Error):通过
std::enable_if
来实现。std::enable_if
的第一个参数是一个布尔常量表达式,如果为true
,则std::enable_if
的第二个参数类型是有效的,否则函数模板实例化失败,但这不会导致编译错误(即SFINAE原则)。在这里,只有当T
是整数类型或浮点数类型时,convertAndReturn
函数模板才会实例化成功,对于其他类型则不会实例化,从而避免了不支持类型的错误调用。
- 类型萃取:使用