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 6

1 ответ:

В вашем первом примере есть только один параметр template, T, который в вызове функции enumValue(myEnumClass) выводится из аргумента. Это правильное использование std::enable_if_t<>.

Во втором примере есть два параметраtemplate, и первый можно снова вывести, но не второй. Это неуместный / неправильный способ использования std::enable_if_t<>.