Мой std :: hash для std :: tuples … Есть улучшения?

Некоторые, возможно, заметили, что std :: hash не поддерживает кортежи. Таким образом, я добавил перегрузку, которая кажется «более приятной», чем решение, которое я видел до сих пор. У кого-нибудь есть идеи по дальнейшему сокращению этого кода? Обратите внимание, что это убийца компилятора! Единственным, кто мог скомпилировать его, был «Clang 3.2» … Компилятор Intel 13.1 не получает специализацию и продолжает говорить, что «стандарт C ++ не поддерживает хэш-блаблы». И нам не нужно говорить об оригинальном компиляторе Microsoft, не так ли?

Кстати, мое решение поддерживает рекурсивные кортежи, такие как std::tuple<std::tuple<int,int>,int> поэтому я не уверен, относится ли это к существующим решениям, которые я видел сегодня.

namespace std
{
template<typename... TTypes>
class hash<std::tuple<TTypes...>>
{
private:
typedef std::tuple<TTypes...> Tuple;

template<int N>
size_t operator()(Tuple value) const { return 0; }

template<int N, typename THead, typename... TTail>
size_t operator()(Tuple value) const
{
constexpr int Index = N - sizeof...(TTail) - 1;
return hash<THead>()(std::get<Index>(value)) ^ operator()<N, TTail...>(value);
}

public:
size_t operator()(Tuple value) const
{
return operator()<sizeof...(TTypes), TTypes...>(value);
}
};
}

1

Решение

Совершенно очевидно, как только вы увидели это:

template<int N, typename THead, typename... TTail>
size_t operator()(Tuple value) const
{
constexpr int Index = N - sizeof...(TTail) - 1;
return hash<THead>()(std::get<Index>(value)) ^ operator()<N, TTail...>(value);
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]