c++ std::enable_if约束变量和问题

c++ std::enable_if constraint variants and problems

本文关键字:变量 约束 问题 std enable c++ if      更新时间:2023-10-16

只是一个简短的问题,给定一个函数,我想返回enum class的底层类型:

为什么这个版本可以正常工作

template<typename T>
constexpr inline
typename std::enable_if_t<
  std::is_enum<T>::value,
  typename std::underlying_type_t<T>
>
enumValue(T p_rVal) noexcept
{
  return static_cast<typename std::underlying_type_t<T>>(p_rVal);
}
if (enumValue(myEnumClass) == 0) {}

而这个失败的"没有匹配的重载函数找到" (VS 2015)错误:

template<
  typename T,
  typename std::enable_if_t<
    std::is_enum<T>::value,
    typename std::underlying_type_t<T>
  >
>
constexpr inline
typename std::underlying_type_t<T>
enumValue(T p_rVal) noexcept
{
  return static_cast<typename std::underlying_type_t<T>>(p_rVal);
}

非常感谢你的帮助!

在您的第一个示例中,只有一个template参数T,它在函数调用enumValue(myEnumClass)中是从参数推导出来的。这是std::enable_if_t<>的正确用法。

在第二个示例中,有两个template参数,第一个可以再次推导,但第二个不能。这是使用std::enable_if_t<>的不恰当/错误的方式。