0

std::hash がタプルをサポートしていないことに気付いた人もいるかもしれません。そのため、これまでに見たソリューションよりも「いい」と思われるオーバーロードを追加しました。このコードをさらに削減するアイデアはありますか? これはコンパイラキラーであることに注意してください! それをコンパイルできたのは「Clang 3.2」だけでした... Intel Compiler 13.1 は特殊化を取得せず、「C++ 標準はハッシュ blabla をサポートしていません」と伝え続けます。そして、元の 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);
        }
    };
}
4

1 に答える 1

3

一度見れば明らかです:

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);
}
于 2013-02-27T22:56:23.730 に答える