我的std :: hash for std :: tuples ...有什么改进吗?

时间:2013-02-27 04:02:08

标签: c++ templates c++11 variadic-templates stdhash

有些人可能已经注意到std :: hash不支持元组。所以我添加了一个过载,它看起来比我直到现在看到的解决方案“更好”。有人有想法进一步削减这些代码吗?请注意,这是一个编译杀手!唯一一个可以编译它的是“Clang 3.2”......英特尔编译器13.1没有得到专业化并一直告诉“C ++标准不支持哈希blabla”。我们不需要谈论原始的Microsoft编译器。

BTW,我的解决方案支持像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 个答案:

答案 0 :(得分:2)

一旦你看到它就非常明显:

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