其他分享
首页 > 其他分享> > c-我的std :: hash for std :: tuples …有什么改进吗?

c-我的std :: hash for std :: tuples …有什么改进吗?

作者:互联网

有些人可能已经注意到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);
        }
    };
}

解决方法:

一看就很明显了:

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

标签:stdhash,c,c11,templates,variadic-templates
来源: https://codeday.me/bug/20191009/1878380.html