首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的std::hash for std::tuples...有什么改进吗?

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

Stack Overflow用户
提问于 2013-02-27 12:02:08
回答 1查看 2.5K关注 0票数 0

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

顺便说一句,我的解决方案支持像std::tuple<std::tuple<int,int>,int>这样的递归元组,所以我不确定这是否也适用于我今天看到的现有解决方案。

代码语言:javascript
复制
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);
        }
    };
}
EN

回答 1

Stack Overflow用户

发布于 2013-02-28 06:56:24

一旦你看过它,就会很明显:

代码语言:javascript
复制
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);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15103975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档