MST

星途 面试题库

面试题:C++函数模板类型参数推导与SFINAE结合

编写一个C++函数模板 `conditionalFunction`,当传入的类型 `T` 是整数类型(`std::is_integral`)时,函数返回 `T` 的平方;当传入的类型 `T` 是浮点数类型(`std::is_floating_point`)时,函数返回 `T` 的平方根;其他类型则编译不通过。请详细说明在此过程中类型参数推导是如何与SFINAE(Substitution Failure Is Not An Error)机制协同工作的。
20.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

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

// 主模板,用于整数类型
template <typename T, typename = std::enable_if_t<std::is_integral_v<T>>>
T conditionalFunction(T value) {
    return value * value;
}

// 偏特化模板,用于浮点数类型
template <typename T, typename = std::enable_if_t<std::is_floating_point_v<T>>>
T conditionalFunction(T value) {
    return std::sqrt(value);
}

类型参数推导与SFINAE机制协同工作说明:

  1. 类型参数推导:在调用conditionalFunction时,编译器会根据传入的实参类型推导出模板参数T。例如,如果传入一个int类型的参数,编译器就会推导出Tint
  2. SFINAE机制std::enable_if_t是SFINAE机制的一种应用。对于主模板template <typename T, typename = std::enable_if_t<std::is_integral_v<T>>>,当T是整数类型时,std::is_integral_v<T>truestd::enable_if_t<std::is_integral_v<T>>是一个有效的类型,模板实例化成功。当T不是整数类型时,std::is_integral_v<T>falsestd::enable_if_t<std::is_integral_v<T>>是一个无效的类型,此时模板实例化失败,但由于SFINAE机制,这种失败不会导致编译错误,只是该模板被排除在候选模板之外。
  3. 偏特化模板:同理,对于偏特化模板template <typename T, typename = std::enable_if_t<std::is_floating_point_v<T>>>,当T是浮点数类型时,模板实例化成功;否则,模板实例化失败但不会导致编译错误。
  4. 其他类型:如果传入的类型既不是整数类型也不是浮点数类型,所有模板实例化都会失败,由于没有其他可用的模板,最终导致编译不通过。