首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内部hashable类声明失败

内部hashable类声明失败
EN

Stack Overflow用户
提问于 2019-03-27 05:47:07
回答 1查看 31关注 0票数 1

我希望在外部类中有一个内部类,并让外部类将内部类放入一个哈希表中。实现这一目标的明智方法是什么?我的尝试是:

代码语言:javascript
复制
#include <unordered_set>

class Outer {
public:
  struct Inner {
    int x;
  };

  std::unordered_set<Outer::Inner> inners;
};

namespace std {
  template<> struct hash<Outer::Inner> {
    size_t operator()(const Outer::Inner& o) {
      return 42;
    }
  };
}

int main() {
  Outer outer;
  std::unordered_set<Outer::Inner> inners;
  return 0;
}

不起作用,因为std::hash专门化不是由我试图声明类外部的unordered_set字段定义的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-27 06:00:56

我不确定这算不算“理智”,但这是我想到的第一个想法。

您可以创建一个自定义散列类,将operator()调用转发给目标对象的成员函数(在下面的实现中为.hash())。

代码语言:javascript
复制
#include <cstddef>
#include <unordered_set>

struct member_hash {
  template <typename T> std::size_t operator()(const T &o) const {
    return o.hash();
  }
};

class Outer {
public:
  struct Inner {
    int x;
    std::size_t hash() const {
      return 42;
    }
  };

  std::unordered_set<Outer::Inner, member_hash> inners;
};

int main() {
  Outer outer;
  std::unordered_set<Outer::Inner, member_hash> inners;
  return 0;
}

还要注意哈希类的operator()应该是const,至少在我的GCC上是这样的,否则它拒绝工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55366680

复制
相关文章

相似问题

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