У меня есть функция хэширования, которая может принимать любой тип объекта и хеш файл, он использует std::hash
внутренне. Поскольку std::hash
не поддерживает типы перечислений, я создал перегрузки функции, 1 для перечислений с использованием std::underlying_type
и 1 для других типов:
template <typename T, typename std::enable_if<std::is_enum<T>::value>::type* = nullptr>
static std::size_t Hash(T const & t)
{
return std::hash<typename std::underlying_type<T>::type>()(t);
}
template <typename T, typename std::enable_if<!std::is_enum<T>::value>::type* = nullptr>
static std::size_t Hash(T const & t)
{
return std::hash<T>()(t);
}
Это прекрасно работает.
Затем я попытался перевести все это в одну функцию с помощью std::conditional
:
template <typename T>
static std::size_t Hash(T const & t)
{
typedef typename std::conditional<std::is_enum<T>::value, std::hash<typename std::underlying_type<T>::type>, std::hash<T>>::type Hasher;
return Hasher()(t);
}
Main:
enum test
{
TEST = 2
};
int main() {
Hash<test>(TEST);
Hash<int>(5);
std::cin.get();
return 0;
}
Это, однако, дало мне ошибка:
/usr/include/С++/5/type_traits: 2190: 38: ошибка: 'int' не является типом перечисления Тип typedef __underlying_type (_Tp);
Я понимаю ошибку, но я не понимаю, почему, я думал, что std::conditional
предотвратит эти ошибки времени компиляции, потому что <int>
использует std::hash<T>
вместо std::hash<typename std::underlying_type<T>::type>
во время компиляции.
Что я делаю неправильно здесь, есть способ, которым я могу объединить 2 функции?