MST

星途 面试题库

面试题:C++函数模板实例化条件控制之中等难度

假设有一个函数模板 `template <typename T> void printIfGreaterThan(T a, T b)`,要求只有当 `a > b` 时才进行实例化,应该如何实现条件控制?请写出具体代码。
23.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#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 条件不满足(类型不支持比较或者不满足比较关系),函数模板不会实例化。