2012-10-25 54 views
1

我需要建立使用从默认一个不同的散列器的哈希表,所以我写的东西,如:如何在Hasher中使用非静态成员函数?

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定义中的类名,而不是特定的结构对象。我该怎么办?在此先感谢您的帮助!

+0

通过这个返回hash_calculation栏;你的意思是这个返回hash_calculation(bar);? – imreal

+0

标准C++中没有'hash_map'类模板。你的意思是'std :: unordered_map'? –

回答

1

你不能。当致电myhaser::hash_calculation时,hash_map应该如何知道应该使用哪个实例myhasher

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

另外,当您可能需要传递一个const引用时,您正在使用按值传递。按价值传递可能会非常慢并且效率低下。

+0

哦,其实我没有通过引用,感谢提及。 –

+0

@DavidM:编辑你的原始问题更加准确,可以防止这个问题对回答问题的人产生干扰。 :-) – Omnifarious

0

标准的“哈希映射”,即std::unordered_map<K, V, H, E, A>将类型为H的哈希对象作为构造函数参数。该对象的副本用于通过函数调用操作符来确定对象的散列值。这种方式可以提供一些背景。显然,你已经在使用非静态函数调用操作符,但是你选择委派给一个静态成员。

相关问题