如何在Hasher中使用非静态成员函数?

时间:2012-10-25 18:31:06

标签: c++ hash static-methods

我需要使用与默认值不同的哈希来建立哈希表,所以我写了类似的东西:

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,比如说,它需要一个非静态成员作为参数。然后整个事情失败了,因为我不能在嵌套结构中使用非静态方法。

这与另一个广泛讨论的问题类似:如何使用非静态函数进行比较或排序。参见例如: Using a non-static class member inside a comparison functionC++ std list sort with custom comparator that depends on an member variable for the object instance。他们都建立了一个函子而不是作为比较器的函数。但是在我的情况下,这个技巧不起作用,因为我需要在hash_map定义中的类名,而不是特定的struct对象。我该怎么办?在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

你做不到。 hash_map如何在调用myhasher时知道应该使用myhaser::hash_calculation的哪个实例?

hash_map不是标准C ++库的一部分,即使在C ++ 11中也是如此,因此它是一个自定义类,并且您没有包含有关它如何工作的信息。如果它有一种方法可以采用某种构造函数参数,它应该使用myhasher,那么你很幸运。但听起来并不像。

另外,当你可能想要传入一个const引用时,你正在使用pass by value。通过价值传递可能会非常缓慢和低效。

答案 1 :(得分:0)

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