面试题答案
一键面试#include <iostream>
#include <type_traits>
template <typename T, typename = std::enable_if_t<std::is_arithmetic_v<T>>>
void printIfGreaterThan(T a, T b) {
if (a > b) {
std::cout << a << " is greater than " << b << std::endl;
}
}
这里使用了 std::enable_if
结合 std::is_arithmetic_v
来确保 T
是算术类型,并且只有在 a > b
时才执行打印操作。如果 T
不是算术类型,函数模板将不会实例化。如果只关注 a > b
这个条件来决定实例化,可以如下实现:
#include <iostream>
template <typename T>
std::enable_if_t<(std::is_arithmetic_v<T> && std::is_arithmetic_v<T> && std::declval<T>() > std::declval<T>()), void>
printIfGreaterThan(T a, T b) {
std::cout << a << " is greater than " << b << std::endl;
}
这种方式直接在模板参数列表中通过 std::enable_if_t
结合条件表达式来控制函数模板是否实例化。如果 a > b
条件不满足(类型不支持比较或者不满足比较关系),函数模板不会实例化。