如何在HASHER中使用非静态成员功能

How to use a non-static member function in Hasher?

本文关键字:静态成员 功能 HASHER      更新时间:2023-10-16

我需要使用与默认的哈希人建立哈希表,因此我写了类似的内容:

class foo {
public:
...
private:
  struct myhasher {
    size_t operator() (myclass bar) { return hash_calculation bar; }
  }
  static size_t hash_calculation (myclass bar) {
    // do some calculation
  }
  hash_map<myclass, myhasher> myhashmap;
}

它有效。现在,由于某种原因,我必须编写一个非静态成员函数来替换Hash_calculation,例如,它需要该类的非静态成员作为参数。然后整个过程失败了,因为我无法在嵌套结构中使用非静态方法。

这与另一个广泛讨论的问题相似:如何使用非静态功能进行比较或排序。例如,请参见:在比较功能中使用非静态类成员和C STD列表与自定义比较器对对象实例的成员变量进行排序。他们都建立了函子,而不是作为比较器的函数。但是,就我而言,此技巧不起作用,因为我需要Hash_map定义中的类名,而不是特定的结构对象。我应该怎么办?预先感谢您的帮助!

你不能。hash_map应该如何知道拨打myhaser::hash_calculation时应使用哪个myhasher的实例?

hash_map不是标准C 库的一部分,甚至在C 11中也不是一个自定义类,并且您不包含有关其工作原理的信息。如果它有一种方法可以使用某种构造函数的参数,则可以使用myhasher,那么您很幸运。但这听起来不像。

另外,当您可能意味着要通过const引用时,您就会使用通过值。通过价值传递可能真的很慢,效率低下。

标准" hash-map",即 std::unordered_map<K, V, H, E, A>将类型 H的哈希对象作为构造函数参数。该对象的副本用于通过函数调用操作员来确定对象的哈希。这种方式可以提供一些上下文。显然,您已经在使用非静态函数调用操作员,但您选择委派给静态成员。