c++ std::enable_if 约束变体和问题
c++ std::enable_if constraint variants and problems
只是一个简短的问题,给出了一个我想要 return 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<>
.
的 inappropriate/wrong 方式
只是一个简短的问题,给出了一个我想要 return 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<>
.