我的std::元组的哈希值.任何改进

My std::hash for std::tuples... Any improvements?

本文关键字:任何改 哈希值 元组 std 我的      更新时间:2023-10-16

有些人可能已经注意到std::hash不支持元组。所以我添加了一个过载,这看起来比我到目前为止看到的解决方案"更好"。谁有进一步削减代码的想法?请注意,这是一个编译器杀手!唯一可以编译它的是"Clang 3.2"…英特尔编译器13.1没有得到专门化,并不断告诉"c++标准不支持哈希之类的"。我们不需要讨论最初的微软编译器,对吧?

顺便说一句,我的解决方案支持递归元组,如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);
        }
    };
}

看了就知道了:

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);
}