给出一个函数的简短问题,我想返回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);
}
非常感谢您的帮助!
答案 0 :(得分:2)
在第一个示例中,只有一个template
参数T
,它在函数调用enumValue(myEnumClass)
中从参数中推导出来。这是std::enable_if_t<>
的正确用法。
在第二个示例中,有两个template
参数,第一个可以再次推断,但不是第二个。这是使用std::enable_if_t<>
的不恰当/错误的方式。