c++ std:: включить варианты и проблемы ограничений if
Просто короткий вопрос, заданный функцией, в которой я хочу вернуть базовый тип 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);
}
Большое Спасибо за помощь!
1 ответ:
В вашем первом примере есть только один параметр
template
,T
, который в вызове функцииenumValue(myEnumClass)
выводится из аргумента. Это правильное использованиеstd::enable_if_t<>
.Во втором примере есть два параметра
template
, и первый можно снова вывести, но не второй. Это неуместный / неправильный способ использованияstd::enable_if_t<>
.